|
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() |