Add Virtual Function Structured Output support#95
Add Virtual Function Structured Output support#95a-simeshin wants to merge 1 commit intoai-forever:mainfrom
Conversation
Обзор кодаРеализация Native Structured Output выглядит хорошо. Найдена одна потенциальная проблема: GigaChatModel.java:394Потенциальный конфликт с явным вызовом функций При установке request.setFunctionCall(Map.of("name", STRUCTURED_OUTPUT_FUNCTION_NAME));Если пользователь уже установил Рекомендация: Добавить проверку существующего значения: if (request.getFunctionCall() == null) {
request.setFunctionCall(Map.of("name", STRUCTURED_OUTPUT_FUNCTION_NAME));
}GigaChatModel.java:409-412Обработка null arguments В коде используется пустая строка String structuredContent = message.getFunctionCall().getArguments() != null
? message.getFunctionCall().getArguments()
: "";Пустая строка не является валидным JSON и может вызвать ошибку парсинга в Spring AI. Рекомендуется использовать Остальной код качественный:
|
81186ee to
8ee190b
Compare
|
Найдены проблемы безопасности и потенциальные ошибки. Детали в следующем комментарии. |
|
|
|
|
|
|
Итого найдено 5 проблем, требующих исправления перед мержем: 2 проблемы безопасности и 3 потенциальные ошибки. Пожалуйста, исправьте указанные замечания. |
8ee190b to
e852568
Compare
Обзор PR: Native Structured Output
|
spring-ai-gigachat/src/main/java/chat/giga/springai/GigaChatModel.java
Outdated
Show resolved
Hide resolved
spring-ai-gigachat/src/main/java/chat/giga/springai/GigaChatModel.java
Outdated
Show resolved
Hide resolved
...achat-example/src/main/java/chat/giga/springai/example/StructuredOutputNativeController.java
Outdated
Show resolved
Hide resolved
Implements structured output using GigaChat's function calling mechanism
to guarantee JSON response format.
Features:
- GigaChatAdvisorParams.VIRTUAL_FUNCTION_STRUCTURED_OUTPUT advisor
- StructuredOutputHelper for virtual function management
- Support for tools + structured output combination (chain calling)
- Comprehensive documentation with API request examples
Usage:
```java
ActorFilms result = chatClient
.prompt("List 5 films by Tarantino")
.advisors(GigaChatAdvisorParams.VIRTUAL_FUNCTION_STRUCTURED_OUTPUT)
.call()
.entity(ActorFilms.class);
```
Testing:
- 20 integration tests covering various scenarios
- Unit tests for metadata handling
Documentation:
- docs/structured-output.md with full examples
- Comparison of Virtual Function vs Prompt-based modes
Co-Authored-By: Claude Opus 4.5 <[email protected]>
e852568 to
0cd3515
Compare
spring-ai-gigachat/src/main/java/chat/giga/springai/tool/structured/StructuredOutputHelper.java
Show resolved
Hide resolved
spring-ai-gigachat/src/main/java/chat/giga/springai/tool/structured/StructuredOutputHelper.java
Show resolved
Hide resolved
spring-ai-gigachat/src/main/java/chat/giga/springai/tool/structured/StructuredOutputHelper.java
Show resolved
Hide resolved
Результаты ревью кодаОбнаружена 1 критическая ошибка и несколько рекомендаций по улучшению кода. ❌ Критическая ошибка (требует исправления)NullPointerException в StructuredOutputHelper.extractContent()
|
Summary
Implements structured output using GigaChat's function calling mechanism to guarantee JSON response format. Uses virtual function
_structured_output_functionthat the model calls with structured data as arguments.Changes
Core
GigaChatOptionsimplementsStructuredOutputChatOptionswithoutputSchemafieldGigaChatModel.createRequest()adds virtual function whenoutputSchemais presentGigaChatModel.buildGeneration()extracts structured content from function argumentsStructuredOutputHelper- utility class for virtual function managementGigaChatAdvisorParams.VIRTUAL_FUNCTION_STRUCTURED_OUTPUT- advisor constantDocumentation
docs/structured-output.md- comprehensive guide with:Tests
StructuredOutputITGigaChatModelTestExamples
StructuredOutputVirtualFunctionController- example controllerUsage
How it works
BeanOutputConverter_structured_output_functionparametersargumentsTest plan
StructuredOutputIT)@JsonPropertyDescriptionDirectorInfowithList<MovieDetails>)SentimentAnalysiswithSentimentenum)CountryList)🤖 Generated with Claude Code