feat(librarian): conditionally enable thinking based on model type
- Add isGeminiModel helper to detect Gemini models
- Disable thinking config for Gemini models (not supported)
- Enable thinking with 32000 token budget for other models
- Add tests verifying both Gemini and Claude behavior
🤖 Generated with assistance of OhMyOpenCode
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import type { AgentConfig } from "@opencode-ai/sdk"
|
||||
import type { AgentPromptMetadata } from "./types"
|
||||
import { isGeminiModel } from "./types"
|
||||
import { createAgentToolRestrictions } from "../shared/permission-compat"
|
||||
|
||||
export const LIBRARIAN_PROMPT_METADATA: AgentPromptMetadata = {
|
||||
@@ -28,7 +29,7 @@ export function createLibrarianAgent(model: string): AgentConfig {
|
||||
"call_omo_agent",
|
||||
])
|
||||
|
||||
return {
|
||||
const base = {
|
||||
description:
|
||||
"Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source.",
|
||||
mode: "subagent" as const,
|
||||
@@ -322,5 +323,11 @@ grep_app_searchGitHub(query: "useQuery")
|
||||
|
||||
`,
|
||||
}
|
||||
|
||||
if (isGeminiModel(model)) {
|
||||
return base
|
||||
}
|
||||
|
||||
return { ...base, thinking: { type: "enabled", budgetTokens: 32000 } }
|
||||
}
|
||||
|
||||
|
||||
@@ -56,6 +56,10 @@ export function isGptModel(model: string): boolean {
|
||||
return model.startsWith("openai/") || model.startsWith("github-copilot/gpt-")
|
||||
}
|
||||
|
||||
export function isGeminiModel(model: string): boolean {
|
||||
return model.includes("gemini")
|
||||
}
|
||||
|
||||
export type BuiltinAgentName =
|
||||
| "sisyphus"
|
||||
| "oracle"
|
||||
|
||||
@@ -91,6 +91,34 @@ describe("createBuiltinAgents with model overrides", () => {
|
||||
expect(agents.oracle.textVerbosity).toBeUndefined()
|
||||
})
|
||||
|
||||
test("Librarian with Gemini model has no thinking", async () => {
|
||||
// #given
|
||||
const overrides = {
|
||||
librarian: { model: "google/gemini-3-flash-preview" },
|
||||
}
|
||||
|
||||
// #when
|
||||
const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL)
|
||||
|
||||
// #then
|
||||
expect(agents.librarian.model).toBe("google/gemini-3-flash-preview")
|
||||
expect(agents.librarian.thinking).toBeUndefined()
|
||||
})
|
||||
|
||||
test("Librarian with Claude model has thinking enabled", async () => {
|
||||
// #given
|
||||
const overrides = {
|
||||
librarian: { model: "anthropic/claude-sonnet-4-5" },
|
||||
}
|
||||
|
||||
// #when
|
||||
const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL)
|
||||
|
||||
// #then
|
||||
expect(agents.librarian.model).toBe("anthropic/claude-sonnet-4-5")
|
||||
expect(agents.librarian.thinking).toEqual({ type: "enabled", budgetTokens: 32000 })
|
||||
})
|
||||
|
||||
test("non-model overrides are still applied after factory rebuild", async () => {
|
||||
// #given
|
||||
const overrides = {
|
||||
|
||||
Reference in New Issue
Block a user