diff --git a/.claude/skills/openbot-copy/SKILL.md b/.claude/skills/openbot-copy/SKILL.md index 17afc18ddb..0ef475c4cb 100644 --- a/.claude/skills/openbot-copy/SKILL.md +++ b/.claude/skills/openbot-copy/SKILL.md @@ -40,7 +40,8 @@ because the admin is the one who sets them. A page anybody can open may not. 1. **Say what happened, then what to do.** "Gmail isn't connected. Connect it to let Bots read your mail." Not why the screen is built the way it is. -2. **One idea per sentence. Short sentences.** A description is one or two sentences, about 20 words. +2. **Use complete sentences for explanations.** Page descriptions, helper text, notices, and empty-state bodies need a subject and a verb, or a direct instruction ("Connect your accounts"). Avoid fragments such as "The apps your Bots use" or "What this Bot can do." Headings, labels, buttons, and short status labels may be fragments. + **Keep only useful explanation.** State the action, outcome, or constraint the person needs. Remove copy that merely repeats the heading. Use natural sentence lengths; do not chop prose into fragments to meet a word count. 3. **Plain words.** "use", not "hold a grant on". "can't", not "is unable to". Contractions are fine. 4. **No "rather than", no em dashes, no "which is why", no "so that nothing … that may be wrong".** These are the marks of text that is explaining itself. Cut the clause or make it its own sentence. @@ -59,6 +60,7 @@ because the admin is the one who sets them. A page anybody can open may not. | Before | After | |---|---| +| The apps and accounts your Bots use as you. Open one to connect it or change it. | Connect your accounts so Bots can use apps on your behalf. | | Your connected accounts could not be loaded, so nothing is listed here rather than a list that may be wrong. Reload the page, and tell an administrator if it persists. | Couldn't load your connections. Reload the page, or ask an admin if it keeps happening. | | Sent to the coworker it is for. Type @ to choose one yourself. | OpenBot picks the right Bot. Type @ to choose one. | | Gmail is a Composio app, and this deployment has no Composio key. (to a non-admin) | Gmail isn't set up yet. An admin has to turn it on. | @@ -73,5 +75,6 @@ because the admin is the one who sets them. A page anybody can open may not. | "this deployment" on a page anybody can open | OpenBot, or say what is missing | | A sentence over ~25 words | Split it, or cut the clause that justifies the screen | | "rather than", an em dash, "which is" in UI text | Rewrite as two short sentences | +| A description beginning "The apps…", "What…", "Who…", or "Where…" without a main verb | State the action or behavior in a complete sentence; remove redundant explanation | | An env var, OAuth, Composio or "grant" outside Admin | Say what the person sees | | A test asserting long explanatory copy | Assert the short sentence, or the role and the key words | diff --git a/agent-computer/tests/enter-text.test.ts b/agent-computer/tests/enter-text.test.ts index ac9510cfb0..9983b5e059 100644 --- a/agent-computer/tests/enter-text.test.ts +++ b/agent-computer/tests/enter-text.test.ts @@ -40,7 +40,8 @@ let browser: Browser; beforeAll(async () => { if (!asked) return; const { chromium } = await import("playwright"); - browser = await chromium.launch(); + // Match the computer image: full Chromium is installed without the headless shell. + browser = await chromium.launch({ channel: "chromium" }); }); afterAll(async () => { diff --git a/agent-langgraph-agui/tests/test_provider_boundaries.py b/agent-langgraph-agui/tests/test_provider_boundaries.py index a0a824f134..f00ca5bcf7 100644 --- a/agent-langgraph-agui/tests/test_provider_boundaries.py +++ b/agent-langgraph-agui/tests/test_provider_boundaries.py @@ -12,6 +12,7 @@ import httpx2 import pytest +from anthropic import Anthropic sys.path.insert(0, str(Path(__file__).resolve().parents[1])) @@ -337,8 +338,14 @@ async def test_anthropic_selection_reaches_anthropic_boundary_without_openai_key assert result["messages"][0].content == "anthropic proof" assert "OPENAI_API_KEY" not in os.environ assert captured[0]["url"] == "http://127.0.0.1:4311/v1/messages" - assert captured[0]["headers"]["x-api-key"] == "sk-ant-openbot-ci" - assert captured[0]["headers"]["anthropic-version"] == "2023-06-01" + # Anthropic 2.3 uses Bearer authentication; older SDKs send x-api-key. + headers = captured[0]["headers"] + assert ( + headers.get("x-api-key") == "sk-ant-openbot-ci" + or headers.get("authorization") == "Bearer sk-ant-openbot-ci" + ) + with Anthropic(api_key="sk-ant-openbot-ci") as sdk: + assert headers["anthropic-version"] == sdk.default_headers["anthropic-version"] assert captured[0]["body"]["model"] == request_model assert captured[0]["body"]["messages"] == [ {"role": "user", "content": "Say hello."} diff --git a/app/src/components/agents/agent-profile.tsx b/app/src/components/agents/agent-profile.tsx index 2197c09c3a..ca4df90cd7 100644 --- a/app/src/components/agents/agent-profile.tsx +++ b/app/src/components/agents/agent-profile.tsx @@ -84,9 +84,11 @@ export function AgentProfile({
- {profile.title} -
+ {profile.title && ( ++ {profile.title} +
+ )}+ An admin must enable built-in hosting before you can run a + Bot here. +
+ )} + > ) : step === "runtime" ? (+ {nameError} +
+ )}