Skip to content

Commit ed0b346

Browse files
committed
Fixed endpoint
1 parent 04c07e3 commit ed0b346

2 files changed

Lines changed: 14 additions & 14 deletions

File tree

src/dremioai/api/dremio/ai_tools.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ async def list_tools() -> ListToolsResponse:
6666
try:
6767
client = AsyncHttpClient()
6868
project_id = settings.instance().dremio.project_id
69-
endpoint = f"/v0/projects/{project_id}" if project_id else "/api/v3"
69+
endpoint = f"/v1/projects/{project_id}" if project_id else "/api/v4"
7070
return await client.get(f"{endpoint}/ai/tools", deser=ListToolsResponse)
7171
except ClientResponseError as e:
7272
log.exception("Failed to list AI tools")
@@ -81,7 +81,7 @@ async def invoke_tool(tool_name: str, args: Dict[str, Any]) -> InvokeToolRespons
8181
try:
8282
client = AsyncHttpClient()
8383
project_id = settings.instance().dremio.project_id
84-
endpoint = f"/v0/projects/{project_id}" if project_id else "/api/v3"
84+
endpoint = f"/v1/projects/{project_id}" if project_id else "/api/v4"
8585
return await client.post(
8686
f"{endpoint}/ai/tools/{safe_name}:invoke",
8787
body={"args": args},

tests/api/dremio/test_ai_tools.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def no_project_id_settings(mock_settings_instance):
3838
@pytest.mark.asyncio
3939
async def test_list_tools_returns_tools(mock_settings_instance):
4040
with HttpMockFramework() as mock:
41-
mock.load_mock_data(r"/v0/projects/[^/]+/ai/tools$", "ai_tools/list_tools.json")
41+
mock.load_mock_data(r"/v1/projects/[^/]+/ai/tools$", "ai_tools/list_tools.json")
4242
result = await list_tools()
4343
assert bool(result)
4444
assert len(result.tools) == 3
@@ -51,7 +51,7 @@ async def test_list_tools_returns_tools(mock_settings_instance):
5151
@pytest.mark.asyncio
5252
async def test_list_tools_returns_input_schema(mock_settings_instance):
5353
with HttpMockFramework() as mock:
54-
mock.load_mock_data(r"/v0/projects/[^/]+/ai/tools$", "ai_tools/list_tools.json")
54+
mock.load_mock_data(r"/v1/projects/[^/]+/ai/tools$", "ai_tools/list_tools.json")
5555
result = await list_tools()
5656
run_sql = next(t for t in result.tools if t.name == "runSql")
5757
assert run_sql.input_schema["type"] == "object"
@@ -61,7 +61,7 @@ async def test_list_tools_returns_input_schema(mock_settings_instance):
6161
@pytest.mark.asyncio
6262
async def test_list_tools_empty_registry(mock_settings_instance):
6363
with HttpMockFramework() as mock:
64-
mock.add_mock_response(r"/v0/projects/[^/]+/ai/tools$", {"tools": []})
64+
mock.add_mock_response(r"/v1/projects/[^/]+/ai/tools$", {"tools": []})
6565
result = await list_tools()
6666
assert result.tools == []
6767
assert bool(result)
@@ -73,7 +73,7 @@ async def test_list_tools_empty_registry(mock_settings_instance):
7373
async def test_invoke_tool_success(mock_settings_instance):
7474
with HttpMockFramework() as mock:
7575
mock.load_mock_data(
76-
r"/v0/projects/[^/]+/ai/tools/runSql:invoke$",
76+
r"/v1/projects/[^/]+/ai/tools/runSql:invoke$",
7777
"ai_tools/invoke_result.json",
7878
)
7979
result = await invoke_tool("runSql", {"sqlText": "SELECT 1"})
@@ -86,7 +86,7 @@ async def test_invoke_tool_success(mock_settings_instance):
8686
async def test_invoke_tool_error_response(mock_settings_instance):
8787
with HttpMockFramework() as mock:
8888
mock.load_mock_data(
89-
r"/v0/projects/[^/]+/ai/tools/unknownTool:invoke$",
89+
r"/v1/projects/[^/]+/ai/tools/unknownTool:invoke$",
9090
"ai_tools/invoke_error.json",
9191
)
9292
result = await invoke_tool("unknownTool", {})
@@ -162,7 +162,7 @@ async def test_list_tools_http_error(mock_settings_instance):
162162
"""list_tools should return a response with error set on HTTP 4xx/5xx."""
163163
with HttpMockFramework() as mock:
164164
mock.add_mock_response(
165-
r"/v0/projects/[^/]+/ai/tools$",
165+
r"/v1/projects/[^/]+/ai/tools$",
166166
{"error": "Unauthorized"},
167167
status=401,
168168
)
@@ -177,7 +177,7 @@ async def test_invoke_tool_http_error(mock_settings_instance):
177177
"""invoke_tool should return a response with error set on HTTP 500."""
178178
with HttpMockFramework() as mock:
179179
mock.add_mock_response(
180-
r"/v0/projects/[^/]+/ai/tools/runSql:invoke$",
180+
r"/v1/projects/[^/]+/ai/tools/runSql:invoke$",
181181
{"error": "Internal Server Error"},
182182
status=500,
183183
)
@@ -193,27 +193,27 @@ async def test_invoke_tool_url_encodes_name(mock_settings_instance):
193193
with HttpMockFramework() as mock:
194194
# The encoded name "my%2Ftool" should appear in the URL
195195
mock.add_mock_response(
196-
r"/v0/projects/[^/]+/ai/tools/my%2Ftool:invoke$",
196+
r"/v1/projects/[^/]+/ai/tools/my%2Ftool:invoke$",
197197
{"result": "ok", "error": None},
198198
)
199199
result = await invoke_tool("my/tool", {})
200200
assert result.result == "ok"
201201

202202

203203
@pytest.mark.asyncio
204-
async def test_list_tools_uses_api_v3_without_project_id(no_project_id_settings):
204+
async def test_list_tools_uses_api_v4_without_project_id(no_project_id_settings):
205205
with HttpMockFramework() as mock:
206-
mock.load_mock_data(r"/api/v3/ai/tools$", "ai_tools/list_tools.json")
206+
mock.load_mock_data(r"/api/v4/ai/tools$", "ai_tools/list_tools.json")
207207
result = await list_tools()
208208
assert bool(result)
209209
assert len(result.tools) == 3
210210

211211

212212
@pytest.mark.asyncio
213-
async def test_invoke_tool_uses_api_v3_without_project_id(no_project_id_settings):
213+
async def test_invoke_tool_uses_api_v4_without_project_id(no_project_id_settings):
214214
with HttpMockFramework() as mock:
215215
mock.load_mock_data(
216-
r"/api/v3/ai/tools/runSql:invoke$",
216+
r"/api/v4/ai/tools/runSql:invoke$",
217217
"ai_tools/invoke_result.json",
218218
)
219219
result = await invoke_tool("runSql", {"sqlText": "SELECT 1"})

0 commit comments

Comments
 (0)