[Haik]: ckpt, dashboards subapp now done fully. Also made the resolve_sdk_env which is used now both for normal agents and quick llm calls, also modded the agents subapp to properly make use of this helper, also modded the run_browser_agent to inheret this from its parent agent

This commit is contained in:
haikdc
2026-04-05 11:09:15 -07:00
parent 84a87b715e
commit c71e25d37b
7 changed files with 76 additions and 60 deletions
+11 -6
View File
@@ -1,20 +1,25 @@
from backend.core.llm.get_llm_client import get_llm_client
from backend.core.llm.resolve_sdk_env import resolve_sdk_env, SDK_ENV_DICT
from typing import Optional
from anthropic.types import Message as AnthropicMessage
import anthropic
async def quick_llm_call(
system: str,
user_content: str,
system_prompt: str,
user_prompt: str,
model: str,
max_tokens: int,
api_key: Optional[str] = None,
nine_router_port: Optional[int] = None,
) -> str:
client = get_llm_client(api_key=api_key, nine_router_port=nine_router_port)
env_dict: SDK_ENV_DICT = resolve_sdk_env(api_key=api_key, nine_router_port=nine_router_port)
client = anthropic.AsyncAnthropic(
api_key=env_dict["ANTHROPIC_API_KEY"],
base_url=env_dict.get("ANTHROPIC_BASE_URL"),
)
resp: AnthropicMessage = await client.messages.create(
model=model,
max_tokens=max_tokens,
system=system,
messages=[{"role": "user", "content": user_content}],
system=system_prompt,
messages=[{"role": "user", "content": user_prompt}],
)
return resp.content[0].text.strip()
@@ -1,7 +1,6 @@
import anthropic
import httpx
from typeguard import typechecked
from typing import Optional
from typing import Optional, Literal, Dict
from backend.core.generic_utils.assert_exactly_one_optional import assert_exactly_one_optional
@typechecked
@@ -12,28 +11,23 @@ def p_check_9router(nine_router_port: int) -> bool:
except Exception:
return False
SDK_ENV_DICT = Dict[Literal["ANTHROPIC_API_KEY", "ANTHROPIC_BASE_URL"], str]
@typechecked
def get_llm_client(
def resolve_sdk_env(
api_key: Optional[str] = None,
nine_router_port: Optional[int] = None,
) -> anthropic.AsyncAnthropic:
"""Build an AsyncAnthropic client.
Priority: API key → 9Router subscription
"""
) -> SDK_ENV_DICT:
"""Resolve credentials into an env dict for ClaudeAgentOptions."""
assert_exactly_one_optional([api_key, nine_router_port])
if api_key is not None:
return anthropic.AsyncAnthropic(api_key=api_key)
elif nine_router_port is not None:
if api_key:
return {"ANTHROPIC_API_KEY": api_key}
elif nine_router_port:
if not p_check_9router(nine_router_port):
raise ValueError("9Router is not running. Set an API key or connect a subscription.")
return anthropic.AsyncAnthropic(
api_key="9router",
base_url=f"http://localhost:{nine_router_port}",
)
return {
"ANTHROPIC_API_KEY": "9router",
"ANTHROPIC_BASE_URL": f"http://localhost:{nine_router_port}",
}
else:
raise ValueError("No AI provider configured. Set an API key or a 9Router port.")
raise ValueError("No AI provider configured. Set an API key or a 9router port")
@@ -34,6 +34,7 @@ async def run_browser_agent(
tool_names.append(tool.to_sdk_args())
browser_config = ClaudeAgentOptions(
env=parent.config.env,
model=parent.model,
system_prompt=BROWSER_AGENT_SYSTEM_PROMPT,
tools=tool_names,