import { genkitPluginV2, GenkitPluginV2 } from 'genkit/plugin';
import { model, modelActionMetadata } from 'genkit/plugin';
import {
GenerateRequest,
GenerateResponseData,
MessageData,
modelRef,
z,
} from 'genkit';
import {
GenerationCommonConfigSchema,
ModelInfo,
} from 'genkit/model';
export interface SimpleApiOptions {
apiKey?: string;
baseUrl?: string;
}
const ConfigSchema = GenerationCommonConfigSchema.extend({
temperature: z.number().min(0).max(1).optional(),
});
function defineSimpleModel(name: string, options?: SimpleApiOptions) {
const modelInfo: ModelInfo = {
label: `Simple API - ${name}`,
supports: {
multiturn: true,
tools: false,
media: false,
systemRole: true,
output: ['text'],
},
};
return model({
name: `simple-api/${name}`,
configSchema: ConfigSchema,
info: modelInfo,
}, async (request: GenerateRequest): Promise<GenerateResponseData> => {
const apiKey = options?.apiKey || process.env.SIMPLE_API_KEY;
const baseUrl = options?.baseUrl || 'https://api.example.com';
// Convert messages to simple text
const prompt = request.messages
.map(m => m.content.map(p => p.text).join(''))
.join('\n');
// Call API
const response = await fetch(`${baseUrl}/generate`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: name,
prompt,
temperature: request.config?.temperature,
max_tokens: request.config?.maxOutputTokens,
}),
});
if (!response.ok) {
throw new Error(`API error: ${response.statusText}`);
}
const data = await response.json();
// Convert to Genkit format
const message: MessageData = {
role: 'model',
content: [{ text: data.text }],
};
return {
message,
finishReason: 'stop',
usage: {
inputTokens: data.usage?.prompt_tokens || 0,
outputTokens: data.usage?.completion_tokens || 0,
},
};
});
}
function simpleApiPlugin(options?: SimpleApiOptions): GenkitPluginV2 {
return genkitPluginV2({
name: 'simple-api',
async init() {
// Return predefined models
return [
defineSimpleModel('base', options),
defineSimpleModel('advanced', options),
];
},
async resolve(actionType, actionName) {
if (actionType === 'model') {
return defineSimpleModel(actionName, options);
}
return undefined;
},
async list() {
return [
modelActionMetadata({
name: 'simple-api/base',
info: { label: 'Simple API - Base' },
}),
modelActionMetadata({
name: 'simple-api/advanced',
info: { label: 'Simple API - Advanced' },
}),
];
},
});
}
export const simpleApi = simpleApiPlugin as {
(options?: SimpleApiOptions): GenkitPluginV2;
model(name: string): any;
};
(simpleApi as any).model = (name: string) => {
return modelRef({
name: `simple-api/${name}`,
configSchema: ConfigSchema,
});
};
export default simpleApi;