Skip to content

Commit 796936c

Browse files
eg-renovate-userdd-eg-user
authored andcommitted
feat: add Tripo3D provider support
Add comprehensive Tripo3D provider integration with support for: - Task creation (text_to_model, image_to_model, etc.) - Task status polling - File uploads and STS token management - Account balance checking Implements all Tripo3D API endpoints from their OpenAPI schema.
1 parent a4bf25c commit 796936c

File tree

8 files changed

+541
-0
lines changed

8 files changed

+541
-0
lines changed

src/globals.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export const FEATHERLESS_AI: string = 'featherless-ai';
102102
export const KRUTRIM: string = 'krutrim';
103103
export const QDRANT: string = 'qdrant';
104104
export const THREE_ZERO_TWO_AI: string = '302ai';
105+
export const TRIPO3D: string = 'tripo3d';
105106

106107
export const VALID_PROVIDERS = [
107108
ANTHROPIC,
@@ -167,6 +168,7 @@ export const VALID_PROVIDERS = [
167168
KRUTRIM,
168169
QDRANT,
169170
THREE_ZERO_TWO_AI,
171+
TRIPO3D,
170172
];
171173

172174
export const CONTENT_TYPES = {

src/providers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import HyperbolicConfig from './hyperbolic';
6363
import { FeatherlessAIConfig } from './featherless-ai';
6464
import KrutrimConfig from './krutrim';
6565
import AI302Config from './302ai';
66+
import Tripo3DConfig from './tripo3d';
6667

6768
const Providers: { [key: string]: ProviderConfigs } = {
6869
openai: OpenAIConfig,
@@ -126,6 +127,7 @@ const Providers: { [key: string]: ProviderConfigs } = {
126127
'featherless-ai': FeatherlessAIConfig,
127128
krutrim: KrutrimConfig,
128129
'302ai': AI302Config,
130+
tripo3d: Tripo3DConfig,
129131
};
130132

131133
export default Providers;

src/providers/tripo3d/api.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { ProviderAPIConfig } from '../types';
2+
3+
const Tripo3DAPIConfig: ProviderAPIConfig = {
4+
getBaseURL: () => 'https://api.tripo3d.ai/v2/openapi',
5+
headers: ({ providerOptions }) => {
6+
return { Authorization: `Bearer ${providerOptions.apiKey}` };
7+
},
8+
getEndpoint: ({ fn }) => {
9+
switch (fn) {
10+
case 'createTask':
11+
return '/task';
12+
case 'getTask':
13+
return '/task';
14+
case 'uploadFile':
15+
return '/upload';
16+
case 'getStsToken':
17+
return '/upload/sts/token';
18+
case 'getBalance':
19+
return '/user/balance';
20+
default:
21+
return '';
22+
}
23+
},
24+
};
25+
26+
export default Tripo3DAPIConfig;

src/providers/tripo3d/balance.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { TRIPO3D } from '../../globals';
2+
import { ProviderConfig, ErrorResponse } from '../types';
3+
import {
4+
generateErrorResponse,
5+
generateInvalidProviderResponseError,
6+
} from '../utils';
7+
8+
export const Tripo3DGetBalanceConfig: ProviderConfig = {};
9+
10+
export interface Tripo3DBalance {
11+
balance: number;
12+
frozen: number;
13+
}
14+
15+
export interface Tripo3DBalanceResponse {
16+
code: number;
17+
data?: Tripo3DBalance;
18+
message?: string;
19+
suggestion?: string;
20+
}
21+
22+
export const Tripo3DBalanceResponseTransform: (
23+
response: Tripo3DBalanceResponse,
24+
responseStatus: number
25+
) => Tripo3DBalanceResponse | ErrorResponse = (response, responseStatus) => {
26+
if (responseStatus !== 200 || response.code !== 0) {
27+
return generateErrorResponse(
28+
{
29+
message: response.message || 'Failed to get balance',
30+
type: 'tripo3d_error',
31+
param: null,
32+
code: response.code?.toString() || 'unknown',
33+
},
34+
TRIPO3D
35+
);
36+
}
37+
38+
if (response.data) {
39+
return {
40+
code: response.code,
41+
data: response.data,
42+
provider: TRIPO3D,
43+
};
44+
}
45+
46+
return generateInvalidProviderResponseError(response, TRIPO3D);
47+
};
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
import { TRIPO3D } from '../../globals';
2+
import { Params } from '../../types/requestBody';
3+
import { ProviderConfig, ErrorResponse } from '../types';
4+
import {
5+
generateErrorResponse,
6+
generateInvalidProviderResponseError,
7+
} from '../utils';
8+
9+
export const Tripo3DCreateTaskConfig: ProviderConfig = {
10+
type: {
11+
param: 'type',
12+
required: true,
13+
},
14+
prompt: {
15+
param: 'prompt',
16+
required: false,
17+
},
18+
negative_prompt: {
19+
param: 'negative_prompt',
20+
required: false,
21+
},
22+
text_seed: {
23+
param: 'text_seed',
24+
required: false,
25+
},
26+
model_seed: {
27+
param: 'model_seed',
28+
required: false,
29+
},
30+
texture_seed: {
31+
param: 'texture_seed',
32+
required: false,
33+
},
34+
style: {
35+
param: 'style',
36+
required: false,
37+
},
38+
model_version: {
39+
param: 'model_version',
40+
required: false,
41+
},
42+
face_limit: {
43+
param: 'face_limit',
44+
required: false,
45+
},
46+
auto_size: {
47+
param: 'auto_size',
48+
required: false,
49+
default: false,
50+
},
51+
quad: {
52+
param: 'quad',
53+
required: false,
54+
default: false,
55+
},
56+
texture: {
57+
param: 'texture',
58+
required: false,
59+
default: true,
60+
},
61+
pbr: {
62+
param: 'pbr',
63+
required: false,
64+
default: true,
65+
},
66+
texture_quality: {
67+
param: 'texture_quality',
68+
required: false,
69+
default: 'standard',
70+
},
71+
texture_alignment: {
72+
param: 'texture_alignment',
73+
required: false,
74+
default: 'original_image',
75+
},
76+
file: {
77+
param: 'file',
78+
required: false,
79+
},
80+
files: {
81+
param: 'files',
82+
required: false,
83+
},
84+
mode: {
85+
param: 'mode',
86+
required: false,
87+
},
88+
orthographic_projection: {
89+
param: 'orthographic_projection',
90+
required: false,
91+
default: false,
92+
},
93+
orientation: {
94+
param: 'orientation',
95+
required: false,
96+
default: 'default',
97+
},
98+
smart_low_poly: {
99+
param: 'smart_low_poly',
100+
required: false,
101+
default: false,
102+
},
103+
generate_parts: {
104+
param: 'generate_parts',
105+
required: false,
106+
default: false,
107+
},
108+
original_model_task_id: {
109+
param: 'original_model_task_id',
110+
required: false,
111+
},
112+
draft_model_task_id: {
113+
param: 'draft_model_task_id',
114+
required: false,
115+
},
116+
format: {
117+
param: 'format',
118+
required: false,
119+
},
120+
out_format: {
121+
param: 'out_format',
122+
required: false,
123+
default: 'glb',
124+
},
125+
topology: {
126+
param: 'topology',
127+
required: false,
128+
},
129+
spec: {
130+
param: 'spec',
131+
required: false,
132+
default: 'tripo',
133+
},
134+
animation: {
135+
param: 'animation',
136+
required: false,
137+
},
138+
animations: {
139+
param: 'animations',
140+
required: false,
141+
},
142+
bake_animation: {
143+
param: 'bake_animation',
144+
required: false,
145+
default: true,
146+
},
147+
export_with_geometry: {
148+
param: 'export_with_geometry',
149+
required: false,
150+
default: true,
151+
},
152+
block_size: {
153+
param: 'block_size',
154+
required: false,
155+
default: 80,
156+
},
157+
force_symmetry: {
158+
param: 'force_symmetry',
159+
required: false,
160+
default: false,
161+
},
162+
flatten_bottom: {
163+
param: 'flatten_bottom',
164+
required: false,
165+
default: false,
166+
},
167+
flatten_bottom_threshold: {
168+
param: 'flatten_bottom_threshold',
169+
required: false,
170+
default: 0.01,
171+
},
172+
texture_size: {
173+
param: 'texture_size',
174+
required: false,
175+
default: 4096,
176+
},
177+
texture_format: {
178+
param: 'texture_format',
179+
required: false,
180+
default: 'JPEG',
181+
},
182+
pivot_to_center_bottom: {
183+
param: 'pivot_to_center_bottom',
184+
required: false,
185+
default: false,
186+
},
187+
with_animation: {
188+
param: 'with_animation',
189+
required: false,
190+
default: false,
191+
},
192+
pack_uv: {
193+
param: 'pack_uv',
194+
required: false,
195+
default: false,
196+
},
197+
bake: {
198+
param: 'bake',
199+
required: false,
200+
default: false,
201+
},
202+
part_names: {
203+
param: 'part_names',
204+
required: false,
205+
},
206+
compress: {
207+
param: 'compress',
208+
required: false,
209+
default: '',
210+
},
211+
texture_prompt: {
212+
param: 'texture_prompt',
213+
required: false,
214+
},
215+
};
216+
217+
export interface Tripo3DCreateTaskResponse {
218+
code: number;
219+
data?: {
220+
task_id: string;
221+
};
222+
message?: string;
223+
suggestion?: string;
224+
}
225+
226+
export const Tripo3DCreateTaskResponseTransform: (
227+
response: Tripo3DCreateTaskResponse,
228+
responseStatus: number
229+
) => Tripo3DCreateTaskResponse | ErrorResponse = (response, responseStatus) => {
230+
if (responseStatus !== 200 || response.code !== 0) {
231+
return generateErrorResponse(
232+
{
233+
message: response.message || 'Task creation failed',
234+
type: 'tripo3d_error',
235+
param: null,
236+
code: response.code?.toString() || 'unknown',
237+
},
238+
TRIPO3D
239+
);
240+
}
241+
242+
if (response.data?.task_id) {
243+
return {
244+
code: response.code,
245+
data: response.data,
246+
provider: TRIPO3D,
247+
};
248+
}
249+
250+
return generateInvalidProviderResponseError(response, TRIPO3D);
251+
};

0 commit comments

Comments
 (0)