Duplicate Class Verification (Generated vs openai-java)
Use this skill to compare generated Java models against the openai-java dependency. The goal is field-by-field comparison of model shapes, even when class or field names differ.
Inputs to confirm
- Generated source root (e.g.,
src/main/java/...)
- The relevant
pom.xml (module) to resolve the openai-java dependency version
- Optional: package or class name hints to narrow the search
Steps
Locate the pom.xml in the current directory tree (find . -name pom.xml). If multiple, ask which module to use.
Resolve openai-java:
- Search the chosen pom for
openai-java (or an explicit group/artifact provided by the user).
- Resolve the version (including properties) and locate the JAR in
~/.m2/repository.
- The model classes live in
openai-java-core, not the top-level openai-java artifact.
List candidate classes:
- Generated classes: scan the source root for
class and record declarations.
- openai-java classes:
jar tf <jar> | grep '\.class$' (filter by package hints if provided).
Extract field signatures (names may differ; compare shape):
- Generated source:
- For
record, use the component list in the record declaration.
- For
class, extract non-static field declarations (type + count) and note any @JsonProperty names.
- Check
toJson/fromJson methods for the actual JSON keys used in serialization.
- openai-java JAR:
- Use
javap -classpath <jar> -p <FQCN> to list fields (ignore static, validated, hashCode$delegate, additionalProperties).
- Extract
@JsonProperty keys from the sources JAR (*-sources.jar) for JSON key comparison.
Compare shapes:
- Compare field count and field types (order-independent).
- Compare JSON keys from
@JsonProperty (openai-java) vs toJson/fromJson string literals (generated).
- Compare enum/union values when field types are enums or string unions.
- Follow type hierarchy:
BinaryData ↔ JsonValue (both represent untyped JSON), Map<String,BinaryData> ↔ Map<String,JsonValue>, Java enum ↔ Kotlin string enum.
Categorize results (do NOT treat all matches the same):
Actionable duplicates — standalone models not in any type hierarchy. These can potentially be suppressed and replaced with the openai-java equivalent. Examples: ComparisonFilter, Reasoning.
Structural equivalents — classes that produce identical JSON but participate in a discriminator hierarchy (e.g., extends Tool, extends TextResponseFormatConfiguration). The SDK's polymorphic serialization (Tool.fromJson() dispatches to FunctionTool.fromJson(), etc.) requires these to exist. They are NOT actionable duplicates. Examples: FunctionTool, FileSearchTool, ComputerUsePreviewTool.
Partial matches — classes with most fields matching but extra Azure-specific fields. Note the extra fields. Examples: CodeInterpreterTool (extra container), WebSearchTool (extra custom_search_configuration).
Report:
- Provide a table with: generated class → openai-java class, field count, matching fields, category.
- Clearly separate actionable duplicates from structural equivalents.
- For actionable duplicates, note whether
@@alternateType or @@access(internal) would be the right suppression mechanism (see dedup-openai skill).
Useful commands
List generated class names
rg -n "^(public\s+)?(final\s+)?(class|record)\s+" <generated_root>
Extract field lines from source (classes)
grep -E '^\s+private\s+' <file> | grep -v 'static\s'
Extract JSON keys from generated toJson/fromJson
grep -E 'jsonWriter\.write|"[a-z_]+"' <file> | grep -v '//'
Inspect fields in a JAR class
javap -classpath <jar> -p <fully.qualified.ClassName>
Extract @JsonProperty from openai-java sources JAR
jar xf <sources-jar> main/com/openai/models/<Class>.kt
grep '@JsonProperty' main/com/openai/models/<Class>.kt
Check if a class participates in a hierarchy
grep 'extends\s' <file> # If it extends Tool, TextResponseFormatConfiguration, etc. → structural
Notes
- Use
search-m2 if you need help locating the dependency version or JAR path.
- If the user provides only a vague class hint, narrow candidates by package or field count first.
- The openai-java classes are Kotlin and use Jackson; generated classes use azure-json (
JsonSerializable). Compare at the JSON wire level, not at the Java API level.
1---2name: dup-classes3description: Verify whether generated Java classes duplicate openai-java models by comparing fields/types (names may differ). Use when checking for duplicate model coverage.4---56# Duplicate Class Verification (Generated vs openai-java)78Use this skill to compare generated Java models against the `openai-java` dependency. The goal is **field-by-field** comparison of model shapes, even when class or field names differ.910## Inputs to confirm11- Generated source root (e.g., `src/main/java/...`)12- The relevant `pom.xml` (module) to resolve the `openai-java` dependency version13- Optional: package or class name hints to narrow the search1415## Steps161. **Locate the pom.xml** in the current directory tree (`find . -name pom.xml`). If multiple, ask which module to use.172. **Resolve openai-java**:18 - Search the chosen pom for `openai-java` (or an explicit group/artifact provided by the user).19 - Resolve the version (including properties) and locate the JAR in `~/.m2/repository`.20 - The model classes live in `openai-java-core`, not the top-level `openai-java` artifact.213. **List candidate classes**:22 - Generated classes: scan the source root for `class` and `record` declarations.23 - openai-java classes: `jar tf <jar> | grep '\.class$'` (filter by package hints if provided).244. **Extract field signatures** (names may differ; compare shape):25 - **Generated source**:26 - For `record`, use the component list in the `record` declaration.27 - For `class`, extract non-static field declarations (type + count) and note any `@JsonProperty` names.28 - Check `toJson`/`fromJson` methods for the actual JSON keys used in serialization.29 - **openai-java JAR**:30 - Use `javap -classpath <jar> -p <FQCN>` to list fields (ignore `static`, `validated`, `hashCode$delegate`, `additionalProperties`).31 - Extract `@JsonProperty` keys from the sources JAR (`*-sources.jar`) for JSON key comparison.325. **Compare shapes**:33 - Compare **field count** and **field types** (order-independent).34 - Compare **JSON keys** from `@JsonProperty` (openai-java) vs `toJson`/`fromJson` string literals (generated).35 - Compare **enum/union values** when field types are enums or string unions.36 - Follow type hierarchy: `BinaryData` ↔ `JsonValue` (both represent untyped JSON), `Map<String,BinaryData>` ↔ `Map<String,JsonValue>`, Java enum ↔ Kotlin string enum.376. **Categorize results** (do NOT treat all matches the same):3839 **Actionable duplicates** — standalone models not in any type hierarchy. These can potentially be suppressed and replaced with the openai-java equivalent. Examples: `ComparisonFilter`, `Reasoning`.4041 **Structural equivalents** — classes that produce identical JSON but participate in a discriminator hierarchy (e.g., `extends Tool`, `extends TextResponseFormatConfiguration`). The SDK's polymorphic serialization (`Tool.fromJson()` dispatches to `FunctionTool.fromJson()`, etc.) requires these to exist. They are NOT actionable duplicates. Examples: `FunctionTool`, `FileSearchTool`, `ComputerUsePreviewTool`.4243 **Partial matches** — classes with most fields matching but extra Azure-specific fields. Note the extra fields. Examples: `CodeInterpreterTool` (extra `container`), `WebSearchTool` (extra `custom_search_configuration`).44457. **Report**:46 - Provide a table with: generated class → openai-java class, field count, matching fields, category.47 - Clearly separate actionable duplicates from structural equivalents.48 - For actionable duplicates, note whether `@@alternateType` or `@@access(internal)` would be the right suppression mechanism (see `dedup-openai` skill).4950## Useful commands5152### List generated class names53```bash54rg -n "^(public\s+)?(final\s+)?(class|record)\s+" <generated_root>55```5657### Extract field lines from source (classes)58```bash59grep -E '^\s+private\s+' <file> | grep -v 'static\s'60```6162### Extract JSON keys from generated toJson/fromJson63```bash64grep -E 'jsonWriter\.write|"[a-z_]+"' <file> | grep -v '//'65```6667### Inspect fields in a JAR class68```bash69javap -classpath <jar> -p <fully.qualified.ClassName>70```7172### Extract @JsonProperty from openai-java sources JAR73```bash74jar xf <sources-jar> main/com/openai/models/<Class>.kt75grep '@JsonProperty' main/com/openai/models/<Class>.kt76```7778### Check if a class participates in a hierarchy79```bash80grep 'extends\s' <file> # If it extends Tool, TextResponseFormatConfiguration, etc. → structural81```8283## Notes84- Use `search-m2` if you need help locating the dependency version or JAR path.85- If the user provides only a vague class hint, narrow candidates by package or field count first.86- The openai-java classes are Kotlin and use Jackson; generated classes use azure-json (`JsonSerializable`). Compare at the JSON wire level, not at the Java API level.