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:
justsisyphus
2026-01-27 08:36:55 +09:00
parent b3be9f33c6
commit 19f43e30c8
3 changed files with 40 additions and 1 deletions

View File

@@ -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 } }
}

View File

@@ -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"

View File

@@ -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 = {