|
@@ -1,6 +1,8 @@
|
|
|
const BaseService = require("../../services/BaseService");
|
|
|
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
|
const GeminiSquareHole = require("./lib/GeminiSquareHole");
|
|
|
+const { TypedValue } = require("../../services/drivers/meta/Runtime");
|
|
|
+const putility = require("@heyputer/putility");
|
|
|
|
|
|
class GeminiService extends BaseService {
|
|
|
async _init () {
|
|
@@ -38,7 +40,6 @@ class GeminiService extends BaseService {
|
|
|
|
|
|
// History is separate, so the last message gets special treatment.
|
|
|
const last_message = messages.pop();
|
|
|
- console.log('last message?', last_message)
|
|
|
const last_message_parts = last_message.parts.map(
|
|
|
part => typeof part === 'string' ? part : part.text
|
|
|
);
|
|
@@ -47,15 +48,36 @@ class GeminiService extends BaseService {
|
|
|
history: messages,
|
|
|
});
|
|
|
|
|
|
- const genResult = await chat.sendMessage(last_message_parts)
|
|
|
+ const usage_calculator = GeminiSquareHole.create_usage_calculator({
|
|
|
+ model_details: (await this.models_()).find(m => m.id === model),
|
|
|
+ });
|
|
|
+
|
|
|
+ if ( stream ) {
|
|
|
+ const genResult = await chat.sendMessageStream(last_message_parts)
|
|
|
+ const stream = genResult.stream;
|
|
|
+
|
|
|
+ const usage_promise = new putility.libs.promise.TeePromise();
|
|
|
+ return new TypedValue({ $: 'ai-chat-intermediate' }, {
|
|
|
+ stream: true,
|
|
|
+ init_chat_stream:
|
|
|
+ GeminiSquareHole.create_chat_stream_handler({
|
|
|
+ stream, usage_promise,
|
|
|
+ }),
|
|
|
+ usage_promise: usage_promise.then(usageMetadata => {
|
|
|
+ return usage_calculator({ usageMetadata });
|
|
|
+ }),
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ const genResult = await chat.sendMessage(last_message_parts)
|
|
|
|
|
|
- debugger;
|
|
|
- const message = genResult.response.candidates[0];
|
|
|
- message.content = message.content.parts;
|
|
|
- message.role = 'assistant';
|
|
|
+ const message = genResult.response.candidates[0];
|
|
|
+ message.content = message.content.parts;
|
|
|
+ message.role = 'assistant';
|
|
|
|
|
|
- const result = { message };
|
|
|
- return result;
|
|
|
+ const result = { message };
|
|
|
+ result.usage = usage_calculator(genResult.response);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -73,6 +95,17 @@ class GeminiService extends BaseService {
|
|
|
output: 30,
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ id: 'gemini-2.0-flash',
|
|
|
+ name: 'Gemini 2.0 Flash',
|
|
|
+ context: 131072,
|
|
|
+ cost: {
|
|
|
+ currency: 'usd-cents',
|
|
|
+ tokens: 1_000_000,
|
|
|
+ input: 10,
|
|
|
+ output: 40,
|
|
|
+ },
|
|
|
+ },
|
|
|
];
|
|
|
}
|
|
|
}
|