Navegador

navegador / hooks / openai-hook.py
Source Blame History 73 lines
4be3595… lmata 1 #!/usr/bin/env python3
4be3595… lmata 2 """
4be3595… lmata 3 Navegador hook for OpenAI Codex / ChatGPT with function calling.
4be3595… lmata 4
4be3595… lmata 5 OpenAI agents can call navegador directly as a function tool. Register the
4be3595… lmata 6 functions below in your assistant's tool list, then call this script to
4be3595… lmata 7 dispatch them.
4be3595… lmata 8
4be3595… lmata 9 Install:
4be3595… lmata 10 Use the function schemas in openai-tools.json alongside this dispatcher.
4be3595… lmata 11 Your agent calls: python3 navegador-openai.py <json_args>
4be3595… lmata 12
4be3595… lmata 13 Example tool call your agent would make:
4be3595… lmata 14 {"name": "nav_search", "arguments": {"query": "authentication", "all": true}}
4be3595… lmata 15
4be3595… lmata 16 This script reads JSON from stdin or argv[1] and dispatches to navegador CLI.
4be3595… lmata 17 """
4be3595… lmata 18
4be3595… lmata 19 import json
4be3595… lmata 20 import os
4be3595… lmata 21 import subprocess
4be3595… lmata 22 import sys
4be3595… lmata 23
4be3595… lmata 24 NAV_DB = os.environ.get("NAVEGADOR_DB", ".navegador/graph.db")
4be3595… lmata 25 NAV_CMD = os.environ.get("NAVEGADOR_CMD", "navegador")
4be3595… lmata 26
4be3595… lmata 27 DISPATCH = {
4be3595… lmata 28 "nav_ingest": lambda a: [NAV_CMD, "ingest", a["path"], "--json"],
4be3595… lmata 29 "nav_context": lambda a: [NAV_CMD, "context", a["file_path"], "--format", "json"],
4be3595… lmata 30 "nav_function": lambda a: [NAV_CMD, "function", a["name"],
4be3595… lmata 31 "--file", a.get("file_path", ""), "--format", "json"],
4be3595… lmata 32 "nav_class": lambda a: [NAV_CMD, "class", a["name"],
4be3595… lmata 33 "--file", a.get("file_path", ""), "--format", "json"],
4be3595… lmata 34 "nav_explain": lambda a: [NAV_CMD, "explain", a["name"], "--format", "json"],
4be3595… lmata 35 "nav_search": lambda a: [NAV_CMD, "search", a["query"],
4be3595… lmata 36 "--format", "json",
4be3595… lmata 37 *( ["--all"] if a.get("all") else [] ),
4be3595… lmata 38 *( ["--docs"] if a.get("by_docstring") else [] )],
4be3595… lmata 39 "nav_concept": lambda a: [NAV_CMD, "concept", a["name"], "--format", "json"],
4be3595… lmata 40 "nav_domain": lambda a: [NAV_CMD, "domain", a["name"], "--format", "json"],
4be3595… lmata 41 "nav_stats": lambda a: [NAV_CMD, "stats", "--json"],
4be3595… lmata 42 "nav_query": lambda a: [NAV_CMD, "query", a["cypher"]],
4be3595… lmata 43 "nav_decorated": lambda a: [NAV_CMD, "decorated", a["decorator"], "--format", "json"],
4be3595… lmata 44 }
4be3595… lmata 45
4be3595… lmata 46
4be3595… lmata 47 def main():
4be3595… lmata 48 raw = sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()
4be3595… lmata 49 try:
4be3595… lmata 50 call = json.loads(raw)
4be3595… lmata 51 except json.JSONDecodeError as e:
4be3595… lmata 52 print(json.dumps({"error": str(e)}))
4be3595… lmata 53 sys.exit(1)
4be3595… lmata 54
4be3595… lmata 55 name = call.get("name") or call.get("function", {}).get("name", "")
4be3595… lmata 56 arguments = call.get("arguments") or call.get("function", {}).get("arguments", {})
4be3595… lmata 57 if isinstance(arguments, str):
4be3595… lmata 58 arguments = json.loads(arguments)
4be3595… lmata 59
4be3595… lmata 60 if name not in DISPATCH:
4be3595… lmata 61 print(json.dumps({"error": f"Unknown tool: {name}"}))
4be3595… lmata 62 sys.exit(1)
4be3595… lmata 63
4be3595… lmata 64 cmd = DISPATCH[name](arguments)
4be3595… lmata 65 result = subprocess.run(
4be3595… lmata 66 ["--db", NAV_DB] and ([cmd[0]] + ["--db", NAV_DB] + cmd[1:]),
4be3595… lmata 67 capture_output=True, text=True,
4be3595… lmata 68 )
4be3595… lmata 69 sys.stdout.write(result.stdout or result.stderr)
4be3595… lmata 70
4be3595… lmata 71
4be3595… lmata 72 if __name__ == "__main__":
4be3595… lmata 73 main()

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button