index.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import type { AgentConfig } from "@opencode-ai/sdk";
  2. import { DEFAULT_MODELS, type AgentName, type PluginConfig } from "../config";
  3. import { createOrchestratorAgent, type AgentDefinition } from "./orchestrator";
  4. import { createOracleAgent } from "./oracle";
  5. import { createLibrarianAgent } from "./librarian";
  6. import { createExploreAgent } from "./explore";
  7. import { createFrontendAgent } from "./frontend";
  8. import { createDocumentWriterAgent } from "./document-writer";
  9. import { createMultimodalAgent } from "./multimodal";
  10. import { createSimplicityReviewerAgent } from "./simplicity-reviewer";
  11. export type { AgentDefinition } from "./orchestrator";
  12. type AgentFactory = (model: string) => AgentDefinition;
  13. const SUBAGENT_FACTORIES: Omit<Record<AgentName, AgentFactory>, "orchestrator"> = {
  14. oracle: createOracleAgent,
  15. librarian: createLibrarianAgent,
  16. explore: createExploreAgent,
  17. "frontend-ui-ux-engineer": createFrontendAgent,
  18. "document-writer": createDocumentWriterAgent,
  19. "multimodal-looker": createMultimodalAgent,
  20. "code-simplicity-reviewer": createSimplicityReviewerAgent,
  21. };
  22. export function createAgents(config?: PluginConfig): AgentDefinition[] {
  23. const disabledAgents = new Set(config?.disabled_agents ?? []);
  24. const agentOverrides = config?.agents ?? {};
  25. // 1. Gather all sub-agent proto-definitions (built-in + custom)
  26. const protoSubAgents: AgentDefinition[] = [
  27. ...Object.entries(SUBAGENT_FACTORIES).map(([name, factory]) => {
  28. const model = DEFAULT_MODELS[name as AgentName];
  29. return factory(model);
  30. }),
  31. ...(config?.custom_agents ?? []).map((ca) => ({
  32. name: ca.name,
  33. description: ca.description,
  34. config: {
  35. model: ca.model ?? "anthropic/claude-sonnet-4-5",
  36. temperature: ca.temperature ?? 0.1,
  37. system: ca.prompt,
  38. },
  39. })),
  40. ];
  41. // 2. Apply common filtering and overrides
  42. const allSubAgents = protoSubAgents
  43. .filter((a) => !disabledAgents.has(a.name))
  44. .map((agent) => {
  45. const override = agentOverrides[agent.name];
  46. if (override) {
  47. if (override.model) agent.config.model = override.model;
  48. if (override.temperature !== undefined) agent.config.temperature = override.temperature;
  49. if (override.prompt) agent.config.system = override.prompt;
  50. if (override.prompt_append)
  51. agent.config.system = `${agent.config.system}\n\n${override.prompt_append}`;
  52. }
  53. return agent;
  54. });
  55. // 3. Create Orchestrator (with its own overrides)
  56. const orchestratorModel =
  57. agentOverrides["orchestrator"]?.model ?? DEFAULT_MODELS["orchestrator"];
  58. const orchestrator = createOrchestratorAgent(orchestratorModel, allSubAgents);
  59. const oOverride = agentOverrides["orchestrator"];
  60. if (oOverride) {
  61. if (oOverride.temperature !== undefined) orchestrator.config.temperature = oOverride.temperature;
  62. if (oOverride.prompt) orchestrator.config.system = oOverride.prompt;
  63. if (oOverride.prompt_append)
  64. orchestrator.config.system = `${orchestrator.config.system}\n\n${oOverride.prompt_append}`;
  65. }
  66. return [orchestrator, ...allSubAgents];
  67. }
  68. export function getAgentConfigs(config?: PluginConfig): Record<string, AgentConfig> {
  69. const agents = createAgents(config);
  70. return Object.fromEntries(agents.map((a) => [a.name, a.config]));
  71. }