Codegraphcontext
CodeGraphContext/CodeGraphContext
Use CodeGraphContext (CGC) to index a repo into a graph DB and query it via CLI or MCP.
Technical reference for OpenSage-ADK — a Google ADK-based framework for long-horizon, tool-heavy AI agents.
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install opensage-agent/opensage-adk opensage-adk --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
Claude Code skills documentation · loads skills from .claude/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .claude/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install opensage-agent/opensage-adk opensage-adk --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .agents/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install opensage-agent/opensage-adk opensage-adk --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .cursor/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install opensage-agent/opensage-adk opensage-adk --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .gemini/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install opensage-agent/opensage-adk opensage-adkInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .github/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opensage-agent/opensage-adk --skill opensage-adk -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install opensage-agent/opensage-adk opensage-adk --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "opensage-adk" agent skill from https://github.com/opensage-agent/opensage-adk/tree/main into .opencode/skills/opensage-adk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "opensage-adk", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
opensage-adkTechnical reference for OpenSage-ADK — a Google ADK-based framework for long-horizon, tool-heavy AI agents.
Opensage Adk is an agent skill from opensage-agent/opensage-adk. Technical reference for OpenSage-ADK — a Google ADK-based framework for long-horizon, tool-heavy AI agents. Covers architecture, configuration, customization, extension, and production agent patterns.
Its SKILL.md is about 6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 833 other files (for example `.github/CODE_OF_CONDUCT.md`, `.github/CONTRIBUTING.md` and `.github/dependabot.yml`).
It works with Neo4j. The licence is Apache-2.0.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 54d6470. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvgitpythonpipbashcurlshdockerFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comastral.shFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYANTHROPIC_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Opensage Adk loads about 6k tokens when it runs. Until then it costs about 53 tokens; SKILL.md has 1,944 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
curl -LsSf https://astral.sh/uv/install.sh | shAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from opensage-agent/opensage-adk at commit 54d6470, republished under its Apache-2.0 licence (© opensage-agent). 1,944 words, ~6,008 tokens.
.claude/skills/opensage-adk/SKILL.md (or your agent's skills folder). This skill also uses 830 other files; get the full folder from GitHub.OpenSage-ADK is an agent framework built on Google ADK for long-horizon, tool-heavy tasks. It unifies six subsystems — sessions, sandboxes, tools, plugins, history management, and multi-agent orchestration — into a single deterministic platform driven by a TOML config and an agent.py factory.
Requirements: Python 3.12+, uv, Docker.
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/opensage-agent/opensage-adk.git
cd opensage-adk
uv venv --python 3.12
uv sync
uv run opensage --helpAn agent directory contains agent.py with a mk_agent() factory. The factory receives the current session ID and returns an OpenSageAgent.
# my_agent/agent.py
import os
from google.adk.models.lite_llm import LiteLlm
import opensage
from opensage.agents import OpenSageAgent
def mk_agent(opensage_session_id: str, model=None):
session = opensage.get_opensage_session(opensage_session_id)
if model is None:
model = LiteLlm(model="openai/gpt-5")
return OpenSageAgent(
name="my_agent",
description="My agent.",
model=model,
instruction="You are a helpful assistant.",
enabled_skills="all",
tools=[],
subagents=[],
)Launch the web UI:
uv run opensage web --agent /path/to/my_agent --port 8000LiteLLM resolves credentials from environment (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.).
Every run follows seven phases:
opensage.get_opensage_session(session_id, config_path) instantiates an OpenSageSession holding configuration, budget, sandbox manager, Neo4j client manager, ADK services, LLM registry, and AgentManager.Entry points (opensage web, evaluation runners, RL integrations) share phases 1–4 and 7; phases 5–6 diverge. get_opensage_session(session_id) returns the active session from anywhere in tool code.
src/opensage/)agents/ — OpenSageAgent, ToolLoadersandbox/ — backends (native, podman, remotedocker, opensandbox, nitrobox, local, k8s) and initializers (main, neo4j, joern, codeql, gdb_mcp, coverage, fuzz)session/ — managersbash_tools/ — bash-scripted Skillstoolbox/ — Python tools and MCP toolsetsconfig/ — TOML loading and dataclassesplugins/ — ADK plugins and Claude Code hooksmemory/ — Neo4j-backed short- and long-term memoryfeatures/ — feature flags, summarization, ToolComboevaluation/ — evaluation runners, dispatchers, RL adapters (benchmarks live in top-level benchmarks/)OpenSageSession owns these runtime components:
AgentManager — agent definitions, spawned instances, peer-message inboxes, and lifecycle states RUNNING, SLEEPING, TERMINATING, TERMINATED.OpenSageSandboxManager — container lifecycle and shared volumes.OpenSageNeo4jClientManager — lazy Neo4j clients.LlmRegistry — configured model pool for LLM-driven agents.BudgetManager — session-level LLM budget tracking.Two orthogonal axes separate concern: backend (where execution happens — Docker local/remote, Kubernetes, native) from initializer (what setup runs inside). A session owns multiple named sandboxes declared in [sandbox.sandboxes.<name>]. Shared mounts /shared (target code/data), /sandbox_scripts, and /bash_tools bind into every sandbox.
Tools declare sandbox dependencies via @requires_sandbox(...) or a ## Requires Sandbox section in SKILL.md. collect_sandbox_dependencies() prunes unused sandboxes at startup. Lifecycle per run: shared-volume init → parallel container launch → per-sandbox initializers → MCP readiness polling.
OpenSageAgent normalizes three tool shapes into one dict via make_toollikes_safe_dict():
BaseToolset (batches unfolded recursively)MCPToolset / OpenSageMCPToolset (tools discovered over MCP)To attach a sub-agent, declare it with subagents=[...] and call it with call_subagent. OpenSageAgent rejects an AgentTool placed in tools=.
Wrappers preserve exception handling (errors become {"success": false, "error": "..."}) and return structure (raw values wrap into {"result": ...}, dicts pass through).
Built-in Python toolbox categories are framework-level: general/ (bash_tool_main, run_terminal_command, view_file, str_replace_edit, WebSearchTool, think, complain, critique), debugger/, binary/, and finish_task/. Domain workflows such as retrieval, static analysis, fuzzing, coverage, Neo4j, and MMP live under src/opensage/bash_tools/ or benchmark-owned modules.
Bash Skills live in src/opensage/bash_tools/ or ~/.local/opensage/bash_tools/ as directories containing SKILL.md plus scripts/. ToolLoader loads them based on the agent's enabled_skills value: None (no skills), "all" (top-level only), or a list of prefixes (e.g., ["fuzz", "retrieval/grep"]).
MCP integration: OpenSageMCPToolset wraps ADK's McpToolset with name stability and tool_name_prefix enforcement. Server lifecycle: sandbox config declares the service, the initializer starts the process, readiness is polled, and tools are discovered on first call.
Plugins hook after_tool_callback, on_event_callback, before_model_callback (and related lifecycle callbacks) in strict sequential order, mutating shared state.
Two kinds:
.py subclassing google.adk.plugins.base_plugin.BasePlugin.PreToolUse/PostToolUse, exact/pipe-separated names, argument globs, wildcards) and actions (prompt or command).Discovery priority (later shadows earlier):
src/opensage/plugins/default/adk_plugins/src/opensage/plugins/default/claude_code_hooks/extra_plugin_dirs entries{agent_dir}/plugins/Available callbacks: before_tool_callback, after_tool_callback, on_tool_error_callback, before_model_callback, after_model_callback, on_model_error_callback, before_agent_callback, after_agent_callback, before_run_callback, after_run_callback, on_user_message_callback, on_event_callback.
Built-in plugins: history_summarizer_plugin, tool_response_summarizer_plugin, quota_after_tool_plugin, runtime_budget_plugin, doom_loop_detector_plugin, build_verifier_plugin, image_injection_plugin, read_before_edit_plugin.
Two levers prevent context overflow:
tool_response_summarizer_plugin): if output exceeds max_tool_response_length (default 10000), summarize or truncate to preview + file pointer /workspace/.tool_outputs/<id>; full output persists in the sandbox.history_summarizer_plugin): if folded event characters exceed max_history_summary_length (default 100000), OpenSageFullEventSummarizer takes the first compaction_percent of events (default 50) after the last boundary, expands to a paired call-response boundary, summarizes via LLM, and replaces the window with a single EventCompaction node.When [history] enable_quota_countdown = true, quota_after_tool_plugin appends {used, remaining, limit} to responses. Short-term memory is file-based (~/.local/opensage/sessions/ on the host, /mem/short_term/ in the sandbox). Long-term memory is also file-based, an index.md under /mem/long_term/ (src/opensage/memory/file_based/long_term/).
Three patterns:
subagents=[...] at construction and invoke with call_subagent.create_subagent(agent_name, instruction, model_name, tools_list, enabled_skills) registers an agent definition; call_subagent(agent_name, request) spawns an instance and returns its session_id; continue_agent_instance and list_subagents manage existing instances. Instance states are RUNNING, SLEEPING, TERMINATING, and TERMINATED.call_subagent(..., mode="async", model_name=...) and read the inbox results, guided by the workflow/ensemble skill.Peer messages use per-instance file-backed inboxes (orchestration/inbox.py). InboxDeliveryPlugin drains pending messages at tool boundaries, and async sub-agent results are posted back to the caller's inbox.
Self-reflection tools: think, plan, complain, note_suspicious_things, log_finding, critique, audit_assumptions, validate_claim. The last three call a model named through the model_name argument.
opensage web| Flag | Default | Purpose |
|---|---|---|
--config FILE | <agent_dir>/config.toml if present | TOML config path |
--agent DIRECTORY | required | Agent folder |
--host TEXT | 127.0.0.1 | Binding host |
--port INTEGER | 8000 | Server port |
--log_level [debug|info|warning|error|critical] | info | Log verbosity |
--auto_cleanup BOOLEAN | false | Clean up sandboxes on exit; false saves snapshot to ~/.local/opensage/sessions/<agent_name>_<session_id> |
--resume | — | Resume most recent session |
--resume-from TEXT | — | Resume specific session (directory name, bare ID suffix, or absolute path); implies --resume |
opensage dependency-checkNo flags. Reports CodeQL, Docker, and kubectl availability.
TOML with template variables: top-level UPPERCASE keys can be referenced as ${VAR_NAME} anywhere. Loading order: default template (src/opensage/templates/configs/default_config.toml) → custom config from --config.
| Field | Type | Default | Purpose |
|---|---|---|---|
task_name | string | None | Session name |
src_dir_in_sandbox | string | /shared/code | Source directory inside containers |
default_host | string | 127.0.0.1 | Default host for sidecar services |
auto_cleanup | bool | true | Clean resources on session end |
[llm]Profiles under [llm.model_configs.<profile>]. Built-in profiles: main (required), summarize (fall back to main if absent).
Fields: model_name (required), temperature, max_tokens, rpm, tpm.
[llm.model_configs.main]
model_name = "openai/gpt-5"
temperature = 0.7
max_tokens = 8192
rpm = 60
[llm.model_configs.summarize]
model_name = "openai/o4-mini"
temperature = 0.3[sandbox]Top-level: default_image, backend (native stable; remotedocker, opensandbox, nitrobox, local, k8s under development), project_relative_shared_data_path, absolute_shared_data_path, mount_host_paths (list of "/host:/container[:ro|rw]"), paths, tolerations (k8s only).
Per-sandbox [sandbox.sandboxes.<name>] built-ins: main, joern, codeql, neo4j, gdb_mcp, pdb_mcp, coverage.
Container fields: image, container_id, timeout (default 300), project_relative_dockerfile_path, absolute_dockerfile_path, command, platform, network, privileged, security_opt, cap_add, gpus, shm_size, mem_limit, cpus, user, working_dir.
Build: build_args, using_cached.
Env/volumes/ports: environment, volumes, mounts, ports, docker_args, extra.
Kubernetes: pod_name, container_name.
[sandbox]
backend = "native"
default_image = "ubuntu:22.04"
absolute_shared_data_path = "/tmp/shared"
[sandbox.sandboxes.main]
image = "ubuntu:22.04"
mem_limit = "4g"
cpus = "2"
environment = {PYTHONUNBUFFERED = "1"}
volumes = ["/host/code:/shared/code:ro"]
[sandbox.sandboxes.joern]
image = "joern/joern:latest"
timeout = 600[mcp][mcp.services.gdb_mcp]
sse_port = 8001
sse_host = "127.0.0.1"
[mcp.services.pdb_mcp]
sse_port = 8002Pair each [mcp.services.<name>] with [sandbox.sandboxes.<name>] so the sandbox launches the server and MCP knows where to reach it. Fields: sse_port (required), sse_host (falls back to default_host).
[history][history]
max_tool_response_length = 10000
enable_quota_countdown = true
[history.events_compaction]
max_history_summary_length = 100000
compaction_percent = 50[plugins][plugins]
enabled = ["doom_loop_detector_plugin", "history_summarizer_plugin"]
extra_plugin_dirs = ["/path/to/shared/plugins"]
[plugins.params.doom_loop_detector_plugin]
threshold = 5Fields: enabled (names or regex patterns), extra_plugin_dirs, params (per-plugin kwargs, keyed by plugin name).
Reusable orchestration recipes live under src/opensage/bash_tools/workflow/. The ensemble recipe replaces the legacy agent_ensemble tool by combining get_available_models, call_subagent(..., mode="async", model_name=...), wait_for_subagent, and inbox-delivered results.
[neo4j][neo4j]
user = "neo4j"
password = "mypassword"
bolt_port = 7687
neo4j_http_port = 7474URI constructed at runtime as neo4j://{default_host}:{bolt_port}. Declare the Neo4j sandbox separately under [sandbox.sandboxes.neo4j].
[build][build]
poc_dir = "/tmp/poc"
compile_command = "gcc -o target target.c"
run_command = "./target"
target_type = "binary"
target_binary = "/tmp/poc/target"OpenSageAgent with one Python function tool (docstring + type hints auto-generate the schema).MCPToolset(connection_params=StdioConnectionParams(server_params=StdioServerParameters(command="npx", args=[...]))).MCPToolset(connection_params=SseConnectionParams(url="http://127.0.0.1:3001/sse")).MCPToolset(connection_params=StreamableHTTPConnectionParams(url="http://0.0.0.0:9998/mcp")).return_history (True exposes intermediate steps; False wraps the chain).create_subagent, call_subagent, continue_agent_instance, send_message, wait_for_subagent, list_subagents, and get_available_models into the root tools.history_summarizer_plugin and tool_response_summarizer_plugin in [plugins] enabled; tune max_history_summary_length and max_tool_response_length.[neo4j] and enable the relevant logging or memory features through the project configuration.workflow/ensemble skill and use call_subagent with mode="async" plus model_name overrides.WebSearchTool(search_context_size="medium") to tools, or GoogleSearchTool() with Gemini.Define a callable with a docstring (description) and type-annotated parameters. Return structured values.
def greet(name: str) -> str:
"""Return a friendly greeting."""
return f"Hello, {name}!"Layout under src/opensage/bash_tools/{category}/{tool-name}/:
tool-name/
├── SKILL.md # YAML frontmatter + markdown doc
└── scripts/
└── tool_script.shSKILL.md frontmatter fields: name, description, should_run_in_sandbox: main. Body sections document parameters (positional/named/flag), return JSON, required sandboxes (## Requires Sandbox), and timeout. Scripts emit {"success": true, "result": "..."} on stdout; exit non-zero on error.
Auto-discovery from src/opensage/bash_tools/ and ~/.local/opensage/bash_tools/. The agent's enabled_skills gates which load. Optional deps/install.sh or deps/<sandbox_type>/install.sh runs once per session during sandbox init (marker under /shared).
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, SseConnectionParams
@safe_tool_execution
@requires_sandbox("gdb_mcp")
def get_toolset(session_id: str) -> MCPToolset:
url = get_mcp_url_from_session_id("gdb_mcp", session_id)
return MCPToolset(connection_params=SseConnectionParams(url=url))Register in the agent's tools list.
Subclass google.adk.plugins.base_plugin.BasePlugin and override any lifecycle callback. Declarative Claude Code hooks live as .json files with matchers and actions. Enable by name in [plugins] enabled.
src/opensage/sandbox/initializers/ subclassing SandboxInitializer (base.py).async def async_initialize(self) -> None.src/opensage/sandbox/factory.py (SANDBOX_INITIALIZERS dict).src/opensage/config/config_dataclass.py.[sandbox.sandboxes.my_sandbox] image = "my_image:tag".For Python deps in the image, install uv, create a venv under /app, and run uv pip install. Activate the venv explicitly per command: /app/.venv/bin/python ....
BaseSandbox (src/opensage/sandbox/base_sandbox.py) — see native_docker_sandbox.py, remote_docker_sandbox.py, k8s_sandbox.py, local_sandbox.py.src/opensage/sandbox/factory.py (SANDBOX_BACKENDS dict).set_config() classmethod.[sandbox] backend = "mybackend".Backends own container/runtime management only; initializers own what to install.
Subclass Evaluation (src/opensage/evaluation/base.py):
_get_task_id(sample), _get_first_user_message(sample)._get_dataset(), _create_task(sample), _get_export_dir_in_sandbox(sample), customized_modify_and_save_results(...), evaluate().Invoke via Python Fire:
python -m benchmarks.<benchmark>.<module> <method> [options]Methods: run (auto parallelism + eval), run_debug (single-threaded + eval), generate (multiprocessing only), generate_threaded, generate_single_thread.
Common options: dataset_path (required), agent_dir (required), max_llm_calls (100), max_workers (6), use_multiprocessing (True), use_sandbox_cache (True), run_until_explicit_finish (False), use_config_model (False), llm_retry_count (3), llm_retry_timeout (30), log_level ("INFO").
Per-sample lifecycle: _create_task → _prepare_environment (launch sandboxes, restore cache) → _load_mk_agent → _run_agent → _collect_outputs (export, save traces, cost) → cleanup.
Output tree:
evals/<eval>/yymmdd_HHMMSS/
├── evaluation_master.log
├── eval_params.json
└── task_001/
├── execution_debug.log, execution_info.log
├── config_used.toml
├── cost_info.json
├── session_trace.{json,txt}
├── metadata.json
├── sandbox_output/
└── neo4j_history/Built-in benchmarks:
--use_explore_agent, --skip_existing, --task_file.sandbox_scripts/codeql/.AREAL — SGLang rollouts (TP=2) + FSDP trainer (DP=2) + GRPO on SeCodePLT.
git clone --recurse-submodules -b adk https://github.com/rucnyz/AReaL
cd AReaL && pip install uv && uv sync --extra cuda
bash examples/opensage/run_opensage_grpo.sh --trial my_experimentKey config in examples/opensage/opensage_grpo_mt.yaml: actor.path (default Qwen/Qwen3-4B), gconfig.max_new_tokens (8192), gconfig.n_samples (4), max_tokens_per_mb (65536), agent_run_args.max_turns (20), log_raw_conversation (true).
SLIME — SGLang rollout in a SLIME container + Megatron-LM trainer on SeCodePLT or mock.
git clone https://github.com/rucnyz/slime && cd slime && git checkout opensage
docker compose up --build
pip install -e /root/opensage
python opensage_mock.py --local_dir /root/opensage_data --output_filename mock_tasks.jsonl
bash /root/opensage/rl/slime/train.sh --benchmark secodeplt --gpus 2,3 --slime-config rl/slime/configs/secodeplt.yamlConfig files in rl/slime/configs/*.yaml tune num-rollout, rollout-batch-size, global-batch-size, lr, kl-loss-coef, save-interval, eval-interval. Integration code lives in src/opensage/evaluation/rl_adapters/ (SlimeLlm, SlimeAdapter, Client, BenchmarkInterface).
| Agent | Domain | Key tools | Distinctive feature |
|---|---|---|---|
harbor_agent | T-Bench software engineering | view_file, str_replace_edit, run_terminal_command, background tasks | Single-agent, minimal toolset, enabled_skills=None |
devops_gym_agent | DevOps-Gym (build, monitoring, test) | File ops, terminal, think, workflow ensemble | Planning as a first-class tool; deadlock recovery via model fan-out |
swebenchpro_agent | SWE-Bench Pro bug fixing | File ops, terminal, sub-agents | Two-phase explorer plus solver |
debugger_agent | Live program verification (sub-agent) | GDB MCP, bash | Hypothesis-only debugging; budget guard (remaining LLM calls < 3) |
vul_agent_static_tools | Vulnerability classification | Joern CPG, Neo4j queries, grep | Tight toolset; designed as an ensemble member |
poc_agent_static_tools | PoC generation (static only) | Neo4j, bash, retrieval, static analysis | Mandatory dynamic sub-agents; path-before-PoC discipline; CyberGym oracle via generate_poc_and_submit |
poc_agent_dynamic_tools | PoC generation (hybrid) | GDB MCP, fuzzing, coverage, Neo4j | Static first → fuzzing → debugger escalation; local verification via run_poc_from_script |
patch_agent | Scaffold template | bash_tool_main | Minimal mk_agent() stub for new agents |
Each production agent ships with its agent.py and config.toml(s) under agent_library/agents/ and can be launched with uv run opensage web --agent agent_library/agents/<name>.
opensage.get_opensage_session() over manual construction; it expands the config.opensage.cleanup_opensage_session(session_id) to release sandboxes.${VAR_NAME} template variables for environment-specific values.extra fields: logger.info("msg", extra={"session_id": session_id}).uv run pytest tests/ (add --cov=src/opensage for coverage).uv run opensage web --config config.toml --agent agent_dir --port 8080 --log_level DEBUG.session.sandboxes.get_sandbox("main").run_command_in_container("pwd").OPENAI_API_KEY / ANTHROPIC_API_KEY in the environment before launch.${VAR_NAME}.default_host (defaults to 127.0.0.1) for k8s or remote Neo4j / MCP.© opensage-agent, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 830 other files in the repository root of opensage-agent/opensage-adk.
Open the folder on GitHubat commit 54d6470
Opensage Adk next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Opensage Adk this skillopensage-agent/opensage-adk | 127 | — | ~6k | Automated safety check: Notes | Apache-2.0 | |
| CodegraphcontextCodeGraphContext/CodeGraphContext | 4.3k | — | ~675 | Automated safety check: Notes | MIT | |
| Add Node Typecartography-cncf/cartography | 4.1k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Cognee Docker Setuptopoteretes/cognee | 32k | — | ~901 | Automated safety check: Notes | Apache-2.0 | |
| Add Partial Reconsamugit83/redamon | 3k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Project Orchestratorthis-rs/project-orchestrator | 140 | — | ~2.6k | Automated safety check: Pass | Custom licence |
CodeGraphContext/CodeGraphContext
Use CodeGraphContext (CGC) to index a repo into a graph DB and query it via CLI or MCP.
cartography-cncf/cartography
Define a new node schema under cartography/models/MODULENAME/, including required properties, sub-resource relationships, extra labels, conditional labels, scoped cleanup, and one-to-many transforms.
topoteretes/cognee
Runs the Cognee AI memory platform in Docker, from a one-file prebuilt image to a full compose stack with UI, MCP server, Postgres and Neo4j.
samugit83/redamon
Adding partial-recon support for a tool: running a single pipeline phase on demand from the workflow graph, reading its inputs from the existing Neo4j graph and merging results back.
this-rs/project-orchestrator
AI agent orchestrator with Neo4j knowledge graph, Meilisearch search, and Tree-sitter parsing.
anylineorg/anyline
AnyLine数据库操作开发规范,涵盖动态数据源注册切换注销、DDL动态建表改表、DML增删改与事务管理、DQL动态查询与聚合统计、元数据管理、查询结果集的聚合、过滤、格式转换等数学计算,AnyLine方法内部会自动适配100+数据库方言,调用方法时忽略不同数据库差异。
opensage-agent/opensage-adk
Run a fuzzing campaign using AFL++ with optional seeds; supports --custommutatorpath (you can write your own custom mutator and use this to execute).
opensage-agent/opensage-adk
Run N tasks under a concurrency cap K via a sliding-window worker pool.
opensage-agent/opensage-adk
Scaffold a new bashtools Skill under bashtools/newtools/. An agent skill from opensage-agent/opensage-adk.
opensage-agent/opensage-adk
Extract crash inputs from fuzzing output into a target directory.
opensage-agent/opensage-adk
Get a path in the call graph from a source function to a specified destination function in the codebase.
opensage-agent/opensage-adk
Tool to get the callee of a function in the codebase by function name and file path.
Works with
Technical reference for OpenSage-ADK — a Google ADK-based framework for long-horizon, tool-heavy AI agents. Opensage Adk is an agent skill from opensage-agent/opensage-adk. Technical reference for OpenSage-ADK — a Google ADK-based framework for long-horizon, tool-heavy AI agents.
Run `npx skills add opensage-agent/opensage-adk --skill opensage-adk -a claude-code`. Or copy the skill folder (the opensage-agent/opensage-adk repository) into .claude/skills/opensage-adk in your project. Claude Code loads it when a task matches its description.
Run `npx skills add opensage-agent/opensage-adk --skill opensage-adk -a codex`. Or copy the skill folder (the opensage-agent/opensage-adk repository) into .agents/skills/opensage-adk in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add opensage-agent/opensage-adk --skill opensage-adk -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/opensage-adk, .gemini/skills/opensage-adk, .github/skills/opensage-adk and .opencode/skills/opensage-adk in your project.
Going by SKILL.md and its folder, Opensage Adk needs the command-line tools its instructions call (uv, git, python, pip, bash and curl) and credentials named OPENAI_API_KEY and ANTHROPIC_API_KEY. Our summary lists: Python 3; Docker; A credential in OPENAI_API_KEY; A credential in ANTHROPIC_API_KEY.
SKILL.md names 2 domains. In commands or code: github.com and astral.sh; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pipes a well-known installer script into a shell), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Opensage Adk is published under the Apache-2.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 6k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Opensage Adk: Codegraphcontext (CodeGraphContext/CodeGraphContext, 4.3k stars), Add Node Type (cartography-cncf/cartography, 4.1k stars), Cognee Docker Setup (topoteretes/cognee, 32k stars) and Add Partial Recon (samugit83/redamon, 3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
opensage-agent (a GitHub organization) maintains it in opensage-agent/opensage-adk, which has 127 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on August 4, 2026.
Source: opensage-agent/opensage-adk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.