リクエストパラメータの適応的処理
Spring AIプロジェクトでは、外部API呼び出し前にリクエストパラメータの動的変換処理が行われます。各プロバイダのAPI仕様の差異を吸収するため、以下の主要処理ステップが実装されています。
プロンプト生成処理
public Prompt buildPrompt() {
List<Message> messageList = new ArrayList<>(getInitialMessages());
String systemContent = processSystemContent();
if (StringUtils.hasText(systemContent)) {
messageList.add(new SystemMessage(systemContent));
}
String userContent = processUserInput();
messageList.add(new UserMessage(userContent, getMediaData()));
if (getChatConfiguration() instanceof FunctionOptions funcOptions) {
applyFunctionOptions(funcOptions);
}
return new Prompt(messageList, getChatConfiguration());
}
private void applyFunctionOptions(FunctionOptions options) {
if (!getFunctionIdentifiers().isEmpty()) {
options.registerFunctions(new HashSet<>(getFunctionIdentifiers()));
}
if (!getFunctionHandlers().isEmpty()) {
options.setFunctionHandlers(getFunctionHandlers());
}
if (!CollectionUtils.isEmpty(getToolContext())) {
options.configureToolContext(getToolContext());
}
}
この処理では、システムメッセージとユーザー入力を統合し、関数呼び出しオプションを適用します。実際の実装では、メッセージタイプに応じた追加処理が行われます。
リクエスト生成機構
ApiRequest createApiRequest(Prompt prompt, boolean streaming) {
List<RequestMessage> requestMessages = prompt.getMessages().stream()
.flatMap(msg -> convertMessage(msg).stream())
.collect(Collectors.toList());
ApiRequest request = new ApiRequest(requestMessages, streaming);
Set<String> activeTools = new HashSet<>();
if (prompt.getOptions() != null) {
request = mergeRuntimeOptions(request, prompt.getOptions());
}
if (!CollectionUtils.isEmpty(defaultConfig.getEnabledTools())) {
activeTools.addAll(defaultConfig.getEnabledTools());
}
request = mergeDefaultConfig(request, defaultConfig);
request = applyToolConfiguration(request, activeTools);
return request;
}
private List<RequestMessage> convertMessage(Message message) {
switch (message.getType()) {
case USER:
case SYSTEM:
return List.of(createBasicMessage(message));
case ASSISTANT:
return List.of(createAssistantMessage((AssistantMessage) message));
case TOOL:
return createToolMessages((ToolMessage) message);
default:
throw new UnsupportedOperationException("未サポートのメッセージタイプ: " + message.getType());
}
}
主要な変換プロセスでは、プロンプト内のメッセージをAPI固有の形式に変換し、ストリーミング設定やツールオプションを統合します。最終的なApiRequestオブジェクトは、ターゲットAPIの仕様に完全に準拠した構造を持ちます。
処理フローの特徴
- メッセージタイプに応じた変換ロジックの分岐
- ランタイム設定とデフォルト設定の階層的マージ
- ツール呼び出しパラメータの動的構成
- API仕様変更への拡張可能な設計