Skip to content

Commit 21f35a2

Browse files
authored
feat(ai-integrations): Provide support for techdocs when present on the Model Catalog JSON object (#698)
* feat(ai-integrations): Provide support for techdocs when present on the Model Catalog JSON object Signed-off-by: John Collier <jcollier@redhat.com> * Update changeset Signed-off-by: John Collier <jcollier@redhat.com> * Trim whitespace Signed-off-by: John Collier <jcollier@redhat.com> --------- Signed-off-by: John Collier <jcollier@redhat.com>
1 parent 5e70ed1 commit 21f35a2

5 files changed

Lines changed: 106 additions & 6 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@red-hat-developer-hub/backstage-plugin-catalog-backend-module-model-catalog': minor
3+
---
4+
5+
Add TechDocs annotations to generated Resource entities when present in the JSON object

workspaces/ai-integrations/plugins/catalog-backend-module-model-catalog/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@backstage/plugin-catalog-backend": "^1.30.0",
4242
"@backstage/plugin-catalog-common": "^1.1.3",
4343
"@backstage/plugin-catalog-node": "^1.15.1",
44-
"@redhat-ai-dev/model-catalog-types": "^1.0.1",
44+
"@redhat-ai-dev/model-catalog-types": "^1.1.0",
4545
"js-yaml": "^4.1.0",
4646
"stream": "^0.0.3",
4747
"yaml": "^2.7.0"

workspaces/ai-integrations/plugins/catalog-backend-module-model-catalog/src/clients/ModelCatalogGenerator.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,86 @@ describe('Model Catalog Generator', () => {
6161
];
6262
expect(modelCatalogEntities).toEqual(expectedModelEntities);
6363
});
64+
it('should generate techdoc annotations when present on the json object', () => {
65+
const modelCatalog: ModelCatalog = {
66+
models: [
67+
{
68+
name: 'ibm-granite',
69+
description: 'IBM Granite code model',
70+
lifecycle: 'production',
71+
owner: 'example-user',
72+
annotations: {
73+
TechDocs:
74+
'https://github.com/redhat-ai-dev/granite-3.1-8b-lab-docs/tree/main',
75+
},
76+
},
77+
],
78+
};
79+
const modelCatalogEntities = GenerateCatalogEntities(modelCatalog);
80+
expect(modelCatalogEntities.length).toEqual(1);
81+
82+
const expectedModelEntities: Entity[] = [
83+
{
84+
apiVersion: 'backstage.io/v1beta1',
85+
kind: 'Resource',
86+
metadata: {
87+
name: 'ibm-granite',
88+
description: 'IBM Granite code model',
89+
annotations: {
90+
'backstage.io/techdocs-ref': `url:https://github.com/redhat-ai-dev/granite-3.1-8b-lab-docs/tree/main`,
91+
},
92+
tags: [],
93+
links: [],
94+
},
95+
spec: {
96+
dependencyOf: [],
97+
owner: 'example-user',
98+
type: 'ai-model',
99+
},
100+
},
101+
];
102+
expect(modelCatalogEntities).toEqual(expectedModelEntities);
103+
});
104+
it('should generate techdoc annotations when present on the json object even if unnecessary whitespace is present', () => {
105+
const modelCatalog: ModelCatalog = {
106+
models: [
107+
{
108+
name: 'ibm-granite',
109+
description: 'IBM Granite code model',
110+
lifecycle: 'production',
111+
owner: 'example-user',
112+
annotations: {
113+
TechDocs:
114+
' https://github.com/redhat-ai-dev/granite-3.1-8b-lab-docs/tree/main ',
115+
},
116+
},
117+
],
118+
};
119+
const modelCatalogEntities = GenerateCatalogEntities(modelCatalog);
120+
expect(modelCatalogEntities.length).toEqual(1);
121+
122+
const expectedModelEntities: Entity[] = [
123+
{
124+
apiVersion: 'backstage.io/v1beta1',
125+
kind: 'Resource',
126+
metadata: {
127+
name: 'ibm-granite',
128+
description: 'IBM Granite code model',
129+
annotations: {
130+
'backstage.io/techdocs-ref': `url:https://github.com/redhat-ai-dev/granite-3.1-8b-lab-docs/tree/main`,
131+
},
132+
tags: [],
133+
links: [],
134+
},
135+
spec: {
136+
dependencyOf: [],
137+
owner: 'example-user',
138+
type: 'ai-model',
139+
},
140+
},
141+
];
142+
expect(modelCatalogEntities).toEqual(expectedModelEntities);
143+
});
64144
it('should generate catalog entities for multiple models and a model server with API', () => {
65145
const modelCatalog: ModelCatalog = {
66146
modelServer: {

workspaces/ai-integrations/plugins/catalog-backend-module-model-catalog/src/clients/ModelCatalogGenerator.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,21 @@ export function GenerateModelResourceEntities(
122122
`component:${modelServer.name}`,
123123
);
124124
}
125+
126+
// Handle any annotations present on the model resource
127+
if (model.annotations !== undefined) {
128+
// Add the techdocs annotation to the resource if present
129+
let techdocsUrl: string = model.annotations.TechDocs;
130+
techdocsUrl = techdocsUrl.trim();
131+
if (model.annotations.TechDocs !== '') {
132+
if (modelResourceEntity.metadata.annotations === undefined) {
133+
modelResourceEntity.metadata.annotations = {};
134+
}
135+
modelResourceEntity.metadata.annotations[
136+
'backstage.io/techdocs-ref'
137+
] = `url:${techdocsUrl}`;
138+
}
139+
}
125140
modelResourceEntities.push(modelResourceEntity);
126141
});
127142

workspaces/ai-integrations/yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10698,7 +10698,7 @@ __metadata:
1069810698
"@backstage/plugin-catalog-backend": ^1.30.0
1069910699
"@backstage/plugin-catalog-common": ^1.1.3
1070010700
"@backstage/plugin-catalog-node": ^1.15.1
10701-
"@redhat-ai-dev/model-catalog-types": ^1.0.1
10701+
"@redhat-ai-dev/model-catalog-types": ^1.1.0
1070210702
js-yaml: ^4.1.0
1070310703
stream: ^0.0.3
1070410704
yaml: ^2.7.0
@@ -10736,10 +10736,10 @@ __metadata:
1073610736
languageName: node
1073710737
linkType: hard
1073810738

10739-
"@redhat-ai-dev/model-catalog-types@npm:^1.0.1":
10740-
version: 1.0.1
10741-
resolution: "@redhat-ai-dev/model-catalog-types@npm:1.0.1"
10742-
checksum: 6b85d92c85f34d675168ad1bebf1b48f015c5fe59f235f06a0d8e7271f5415e25e40cbe1d5eecf03ada85be8214f09353f1987a316f97b9d681e4ef6d32102de
10739+
"@redhat-ai-dev/model-catalog-types@npm:^1.1.0":
10740+
version: 1.1.0
10741+
resolution: "@redhat-ai-dev/model-catalog-types@npm:1.1.0"
10742+
checksum: 1974a2b6a3cc7cc1ef9da13e2794482bc00404f70aa6bfaf349992a7df4ad4ae7d8fe856bcd814595fcfef9f6a16c72967e0e6cf3d3d4a4d22398a355ae00b41
1074310743
languageName: node
1074410744
linkType: hard
1074510745

0 commit comments

Comments
 (0)