Spring AIにおけるリクエストパラメータ処理の内部実装

リクエストパラメータの適応的処理

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仕様変更への拡張可能な設計

タグ: Spring AI API統合 リクエスト処理 パラメータ変換 Javaフレームワーク

7月11日 21:57 投稿