AI Agent handoffs (#13472)

This commit is contained in:
Abdul Rahman
2025-07-30 20:26:58 +05:30
committed by GitHub
parent b0c1404d23
commit da79afa80a
11 changed files with 506 additions and 65 deletions
@@ -3,8 +3,6 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Readable } from 'stream';
import { createAnthropic } from '@ai-sdk/anthropic';
import { createOpenAI } from '@ai-sdk/openai';
import {
CoreMessage,
CoreUserMessage,
@@ -17,10 +15,7 @@ import {
} from 'ai';
import { In, Repository } from 'typeorm';
import {
ModelId,
ModelProvider,
} from 'src/engine/core-modules/ai/constants/ai-models.const';
import { ModelProvider } from 'src/engine/core-modules/ai/constants/ai-models.const';
import { AiModelRegistryService } from 'src/engine/core-modules/ai/services/ai-model-registry.service';
import { FileEntity } from 'src/engine/core-modules/file/entities/file.entity';
import { FileService } from 'src/engine/core-modules/file/services/file.service';
@@ -73,38 +68,6 @@ export class AgentExecutionService {
private readonly fileRepository: Repository<FileEntity>,
) {}
getModel = (modelId: ModelId, provider: ModelProvider) => {
switch (provider) {
case ModelProvider.OPENAI_COMPATIBLE: {
const OpenAIProvider = createOpenAI({
baseURL: this.twentyConfigService.get('OPENAI_COMPATIBLE_BASE_URL'),
apiKey: this.twentyConfigService.get('OPENAI_COMPATIBLE_API_KEY'),
});
return OpenAIProvider(modelId);
}
case ModelProvider.OPENAI: {
const OpenAIProvider = createOpenAI({
apiKey: this.twentyConfigService.get('OPENAI_API_KEY'),
});
return OpenAIProvider(modelId);
}
case ModelProvider.ANTHROPIC: {
const AnthropicProvider = createAnthropic({
apiKey: this.twentyConfigService.get('ANTHROPIC_API_KEY'),
});
return AnthropicProvider(modelId);
}
default:
throw new AgentException(
`Unsupported provider: ${provider}`,
AgentExceptionCode.AGENT_EXECUTION_FAILED,
);
}
};
private async validateApiKey(provider: ModelProvider): Promise<void> {
let apiKey: string | undefined;
@@ -171,10 +134,21 @@ export class AgentExecutionService {
this.logger.log(`Generated ${Object.keys(tools).length} tools for agent`);
const registeredModel = this.aiModelRegistryService.getModel(
aiModel.modelId,
);
if (!registeredModel) {
throw new AgentException(
`Model ${aiModel.modelId} not found in registry`,
AgentExceptionCode.AGENT_EXECUTION_FAILED,
);
}
return {
system,
tools,
model: this.getModel(aiModel.modelId, aiModel.provider),
model: registeredModel.model,
...(messages && { messages }),
...(prompt && { prompt }),
maxSteps: AGENT_CONFIG.MAX_STEPS,