Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions assistant/src/config/schemas/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ export const LLMCallSiteEnum = z.enum([
"styleAnalyzer",
"inviteInstructionGenerator",
"skillCategoryInference",
"meetConsentMonitor",
"meetChatOpportunity",
]);
export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum CallSiteDomain: String, CaseIterable, Identifiable, Hashable {
case notifications
case voice
case utility
case skills

public var id: String { rawValue }

Expand All @@ -28,6 +29,7 @@ public enum CallSiteDomain: String, CaseIterable, Identifiable, Hashable {
case .notifications: return "Notifications"
case .voice: return "Voice"
case .utility: return "Utility"
case .skills: return "Skills"
}
}

Expand All @@ -42,6 +44,7 @@ public enum CallSiteDomain: String, CaseIterable, Identifiable, Hashable {
case .notifications: return 4
case .voice: return 5
case .utility: return 6
case .skills: return 7
}
}
}
Expand Down Expand Up @@ -140,6 +143,9 @@ public enum CallSiteCatalog {
CallSiteOverride(id: "styleAnalyzer", displayName: "Style analyzer", domain: .utility),
CallSiteOverride(id: "inviteInstructionGenerator", displayName: "Invite instruction generator", domain: .utility),
CallSiteOverride(id: "skillCategoryInference", displayName: "Skill category inference", domain: .utility),
// Skills
CallSiteOverride(id: "meetConsentMonitor", displayName: "Meet · Consent monitor", domain: .skills),
CallSiteOverride(id: "meetChatOpportunity", displayName: "Meet · Chat opportunity", domain: .skills),
Comment on lines +147 to +148
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Update call-site count assertions after adding Meet entries

Adding these two catalog entries increases CallSiteCatalog from 26 to 28, but SettingsStoreCallSiteOverrideTests.testCatalogCoversEveryCallSite still hard-codes 26 for all, byId, and validIds (in clients/macos/vellum-assistantTests/SettingsStoreCallSiteOverrideTests.swift). As a result, the macOS settings test suite will fail deterministically until those invariants are updated to match the new catalog size/domain plan.

Useful? React with 👍 / 👎.

]

/// Lookup table from call-site ID to its catalog entry. Constructed
Expand Down
12 changes: 7 additions & 5 deletions skills/meet-join/daemon/consent-monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,9 @@ export interface MeetConsentMonitorDeps {
config: MeetConsentMonitorConfig;
/**
* Ask the LLM for an objection verdict. Defaults to a wrapper around the
* repo-wide provider abstraction using {@link CONSENT_LLM_MAX_TOKENS} and
* `modelIntent: "latency-optimized"`. Tests inject scripted responses.
* repo-wide provider abstraction using {@link CONSENT_LLM_MAX_TOKENS}
* under the `meetConsentMonitor` call site. Tests inject scripted
* responses.
*/
llmAsk?: ObjectionLLMAsk;
/** Override the dispatcher subscribe (tests). */
Expand Down Expand Up @@ -693,15 +694,16 @@ const OBJECTION_TOOL: ToolDefinition = {

/**
* Default {@link ObjectionLLMAsk} — routes through the repo-wide provider
* abstraction with `modelIntent: "latency-optimized"`, times out at
* abstraction under the `meetConsentMonitor` call site, times out at
* {@link CONSENT_LLM_TIMEOUT_MS}, and extracts the tool-use input as the
* structured verdict.
*
* Hidden behind an injectable hook so tests never need to stand up a
* real provider.
*/
async function defaultLLMAsk(prompt: string): Promise<ObjectionDecision> {
const provider: Provider | null = await getConfiguredProvider();
const provider: Provider | null =
await getConfiguredProvider("meetConsentMonitor");
if (!provider) {
// No provider available — conservatively assume no objection so the
// monitor doesn't interrupt a meeting based on missing infra.
Expand All @@ -716,7 +718,7 @@ async function defaultLLMAsk(prompt: string): Promise<ObjectionDecision> {
"You are a strict JSON classifier. Only respond via the report_objection tool.",
{
config: {
modelIntent: "latency-optimized",
callSite: "meetConsentMonitor",
max_tokens: CONSENT_LLM_MAX_TOKENS,
tool_choice: { type: "tool" as const, name: OBJECTION_TOOL.name },
},
Expand Down
18 changes: 9 additions & 9 deletions skills/meet-join/daemon/session-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -505,9 +505,9 @@ export interface MeetSessionManagerDeps {
/**
* Override the chat-opportunity-detector factory. Default constructs a
* {@link MeetChatOpportunityDetector} with a Tier 2 LLM callback that
* routes through the repo-wide provider abstraction at
* `modelIntent: "latency-optimized"`. Tests can inject a fake to
* observe start/dispose/stats without spinning up the LLM path.
* routes through the repo-wide provider abstraction under the
* `meetChatOpportunity` call site. Tests can inject a fake to observe
* start/dispose/stats without spinning up the LLM path.
*
* Only consulted when `services.meet.proactiveChat.enabled === true`.
*/
Expand Down Expand Up @@ -1689,10 +1689,9 @@ const CHAT_OPPORTUNITY_TOOL: ToolDefinition = {

/**
* Default Tier 2 chat-opportunity LLM callback. Routes through the
* repo-wide provider abstraction at
* `modelIntent: "latency-optimized"` — keeping the proactive-chat path
* on the same latency tier the consent monitor uses so both background
* loops share tuning. Times out at
* repo-wide provider abstraction under the `meetChatOpportunity` call
* site, keeping the proactive-chat path on its own configurable lane
* alongside the consent monitor. Times out at
* {@link CHAT_OPPORTUNITY_LLM_TIMEOUT_MS} and extracts the tool-use
* input as the structured verdict.
*
Expand All @@ -1703,7 +1702,8 @@ const CHAT_OPPORTUNITY_TOOL: ToolDefinition = {
async function defaultCallDetectorLLM(
prompt: string,
): Promise<ChatOpportunityDecision> {
const provider: Provider | null = await getConfiguredProvider();
const provider: Provider | null =
await getConfiguredProvider("meetChatOpportunity");
if (!provider) {
return { shouldRespond: false, reason: "" };
}
Expand All @@ -1716,7 +1716,7 @@ async function defaultCallDetectorLLM(
"You are a strict JSON classifier. Only respond via the report_chat_opportunity tool.",
{
config: {
modelIntent: "latency-optimized",
callSite: "meetChatOpportunity",
max_tokens: CHAT_OPPORTUNITY_LLM_MAX_TOKENS,
tool_choice: {
type: "tool" as const,
Expand Down
Loading