mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-17 02:05:22 -04:00
Scope model helper endpoint resolution (#3007)
This commit is contained in:
@@ -1368,7 +1368,7 @@ def setup_calendar_routes() -> APIRouter:
|
|||||||
"tomorrow", "next Tuesday", "in 30 minutes" resolve correctly.
|
"tomorrow", "next Tuesday", "in 30 minutes" resolve correctly.
|
||||||
Uses the "utility" endpoint (small / fast model) to keep latency low.
|
Uses the "utility" endpoint (small / fast model) to keep latency low.
|
||||||
"""
|
"""
|
||||||
_require_user(request)
|
owner = _require_user(request)
|
||||||
from src.endpoint_resolver import resolve_endpoint
|
from src.endpoint_resolver import resolve_endpoint
|
||||||
from src.llm_core import llm_call_async
|
from src.llm_core import llm_call_async
|
||||||
from src.text_helpers import strip_think
|
from src.text_helpers import strip_think
|
||||||
@@ -1394,9 +1394,9 @@ def setup_calendar_routes() -> APIRouter:
|
|||||||
if tz_hint:
|
if tz_hint:
|
||||||
set_user_tz_name(tz_hint)
|
set_user_tz_name(tz_hint)
|
||||||
|
|
||||||
url, model, headers = resolve_endpoint("utility")
|
url, model, headers = resolve_endpoint("utility", owner=owner or None)
|
||||||
if not url:
|
if not url:
|
||||||
url, model, headers = resolve_endpoint("default")
|
url, model, headers = resolve_endpoint("default", owner=owner or None)
|
||||||
if not url or not model:
|
if not url or not model:
|
||||||
return {"ok": False, "error": "No LLM endpoint configured"}
|
return {"ok": False, "error": "No LLM endpoint configured"}
|
||||||
|
|
||||||
|
|||||||
@@ -853,10 +853,10 @@ def setup_document_routes(session_manager, upload_handler=None) -> APIRouter:
|
|||||||
from src.llm_core import llm_call_async
|
from src.llm_core import llm_call_async
|
||||||
|
|
||||||
user = get_current_user(request)
|
user = get_current_user(request)
|
||||||
url, model, headers = resolve_task_endpoint()
|
url, model, headers = resolve_task_endpoint(owner=user or None)
|
||||||
if not url or not model:
|
if not url or not model:
|
||||||
# Fall back to default endpoint
|
# Fall back to default endpoint
|
||||||
url, model, headers = resolve_endpoint("default")
|
url, model, headers = resolve_endpoint("default", owner=user or None)
|
||||||
if not url or not model:
|
if not url or not model:
|
||||||
raise HTTPException(500, "No endpoint configured for AI tidy")
|
raise HTTPException(500, "No endpoint configured for AI tidy")
|
||||||
|
|
||||||
|
|||||||
@@ -522,6 +522,8 @@ def setup_history_routes(session_manager) -> APIRouter:
|
|||||||
async def compact_session(request: Request, session_id: str):
|
async def compact_session(request: Request, session_id: str):
|
||||||
"""Manually trigger context compaction for a session."""
|
"""Manually trigger context compaction for a session."""
|
||||||
_verify_session_owner(request, session_id)
|
_verify_session_owner(request, session_id)
|
||||||
|
from src.auth_helpers import effective_user
|
||||||
|
owner = effective_user(request)
|
||||||
try:
|
try:
|
||||||
session = session_manager.get_session(session_id)
|
session = session_manager.get_session(session_id)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -555,7 +557,7 @@ def setup_history_routes(session_manager) -> APIRouter:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Use utility model if available
|
# Use utility model if available
|
||||||
util_url, util_model, util_headers = resolve_endpoint("utility")
|
util_url, util_model, util_headers = resolve_endpoint("utility", owner=owner or None)
|
||||||
compact_url = util_url or session.endpoint_url
|
compact_url = util_url or session.endpoint_url
|
||||||
compact_model = util_model or session.model
|
compact_model = util_model or session.model
|
||||||
compact_headers = util_headers if util_url else session.headers
|
compact_headers = util_headers if util_url else session.headers
|
||||||
|
|||||||
@@ -181,9 +181,9 @@ async def dispatch_reminder(
|
|||||||
try:
|
try:
|
||||||
from src.endpoint_resolver import resolve_endpoint
|
from src.endpoint_resolver import resolve_endpoint
|
||||||
from src.llm_core import llm_call_async
|
from src.llm_core import llm_call_async
|
||||||
url, model, headers = resolve_endpoint("utility")
|
url, model, headers = resolve_endpoint("utility", owner=owner or None)
|
||||||
if not url:
|
if not url:
|
||||||
url, model, headers = resolve_endpoint("default")
|
url, model, headers = resolve_endpoint("default", owner=owner or None)
|
||||||
if url and model:
|
if url and model:
|
||||||
raw = await llm_call_async(
|
raw = await llm_call_async(
|
||||||
url=url, model=model,
|
url=url, model=model,
|
||||||
|
|||||||
@@ -1047,6 +1047,7 @@ def setup_task_routes(task_scheduler) -> APIRouter:
|
|||||||
desc = (body.get("description") or "").strip()
|
desc = (body.get("description") or "").strip()
|
||||||
if not desc:
|
if not desc:
|
||||||
return {"success": False, "message": "Nothing to parse"}
|
return {"success": False, "message": "Nothing to parse"}
|
||||||
|
user = _owner(request)
|
||||||
|
|
||||||
now = _dt.now()
|
now = _dt.now()
|
||||||
# Give the model the current date/time + weekday so relative phrasing
|
# Give the model the current date/time + weekday so relative phrasing
|
||||||
@@ -1073,9 +1074,9 @@ def setup_task_routes(task_scheduler) -> APIRouter:
|
|||||||
"use cron '0 H * * 1-5'. Keep the prompt actionable and self-contained."
|
"use cron '0 H * * 1-5'. Keep the prompt actionable and self-contained."
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
url, model, headers = resolve_endpoint("utility")
|
url, model, headers = resolve_endpoint("utility", owner=user or None)
|
||||||
if not url:
|
if not url:
|
||||||
url, model, headers = resolve_endpoint("default")
|
url, model, headers = resolve_endpoint("default", owner=user or None)
|
||||||
if not (url and model):
|
if not (url and model):
|
||||||
return {"success": False, "message": "No model endpoint configured"}
|
return {"success": False, "message": "No model endpoint configured"}
|
||||||
raw = await llm_call_async(
|
raw = await llm_call_async(
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
"""Model-assisted route helpers must resolve endpoints with owner scope."""
|
||||||
|
|
||||||
|
import ast
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def _function_source(path: str, name: str) -> str:
|
||||||
|
source = Path(path).read_text(encoding="utf-8")
|
||||||
|
tree = ast.parse(source)
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name == name:
|
||||||
|
return ast.get_source_segment(source, node) or ""
|
||||||
|
raise AssertionError(f"{name} not found in {path}")
|
||||||
|
|
||||||
|
|
||||||
|
def test_document_ai_tidy_resolves_with_owner_scope():
|
||||||
|
body = _function_source("routes/document_routes.py", "ai_tidy_documents")
|
||||||
|
assert "resolve_task_endpoint(owner=user or None)" in body
|
||||||
|
assert 'resolve_endpoint("default", owner=user or None)' in body
|
||||||
|
|
||||||
|
|
||||||
|
def test_calendar_quick_parse_resolves_with_owner_scope():
|
||||||
|
body = _function_source("routes/calendar_routes.py", "quick_parse")
|
||||||
|
assert "owner = _require_user(request)" in body
|
||||||
|
assert 'resolve_endpoint("utility", owner=owner or None)' in body
|
||||||
|
assert 'resolve_endpoint("default", owner=owner or None)' in body
|
||||||
|
|
||||||
|
|
||||||
|
def test_task_parse_resolves_with_owner_scope():
|
||||||
|
body = _function_source("routes/task_routes.py", "parse_task")
|
||||||
|
assert "user = _owner(request)" in body
|
||||||
|
assert 'resolve_endpoint("utility", owner=user or None)' in body
|
||||||
|
assert 'resolve_endpoint("default", owner=user or None)' in body
|
||||||
|
|
||||||
|
|
||||||
|
def test_history_compact_resolves_with_owner_scope():
|
||||||
|
body = _function_source("routes/history_routes.py", "compact_session")
|
||||||
|
assert "owner = effective_user(request)" in body
|
||||||
|
assert 'resolve_endpoint("utility", owner=owner or None)' in body
|
||||||
|
|
||||||
|
|
||||||
|
def test_note_reminder_synthesis_resolves_with_owner_scope():
|
||||||
|
body = _function_source("routes/note_routes.py", "dispatch_reminder")
|
||||||
|
assert 'resolve_endpoint("utility", owner=owner or None)' in body
|
||||||
|
assert 'resolve_endpoint("default", owner=owner or None)' in body
|
||||||
Reference in New Issue
Block a user