partial googleai fixes; adds jsonl file backend for promptlogger stolen from fiz

This commit is contained in:
nai-degen
2024-04-23 03:43:38 -05:00
parent 0a27345c29
commit 32b623d6bc
7 changed files with 150 additions and 8 deletions
+24 -2
View File
@@ -11,7 +11,7 @@ import { ProxyResHandlerWithBody } from ".";
import { assertNever } from "../../../shared/utils";
import {
AnthropicChatMessage,
flattenAnthropicMessages,
flattenAnthropicMessages, GoogleAIChatMessage,
MistralAIChatMessage,
OpenAIChatMessage,
} from "../../../shared/api-schemas";
@@ -62,6 +62,7 @@ const getPromptForRequest = (
):
| string
| OpenAIChatMessage[]
| { contents: GoogleAIChatMessage[] }
| { system: string; messages: AnthropicChatMessage[] }
| MistralAIChatMessage[]
| OaiImageResult => {
@@ -87,7 +88,7 @@ const getPromptForRequest = (
case "anthropic-text":
return req.body.prompt;
case "google-ai":
return req.body.prompt.text;
return { contents: req.body.contents };
default:
assertNever(req.outboundApi);
}
@@ -98,6 +99,7 @@ const flattenMessages = (
| string
| OaiImageResult
| OpenAIChatMessage[]
| { contents: GoogleAIChatMessage[] }
| { system: string; messages: AnthropicChatMessage[] }
| MistralAIChatMessage[]
): string => {
@@ -108,6 +110,16 @@ const flattenMessages = (
const { system, messages } = val;
return `System: ${system}\n\n${flattenAnthropicMessages(messages)}`;
}
if (isGoogleAIChatPrompt(val)) {
return val.contents
.map(({ parts, role }) => {
const text = parts
.map((p) => p.text)
.join("\n");
return `${role}: ${text}`;
})
.join("\n");
}
if (Array.isArray(val)) {
return val
.map(({ content, role }) => {
@@ -128,6 +140,16 @@ const flattenMessages = (
return val.prompt.trim();
};
function isGoogleAIChatPrompt(
val: unknown
): val is { contents: GoogleAIChatMessage[] } {
return (
typeof val === "object" &&
val !== null &&
"contents" in val
);
}
function isAnthropicChatPrompt(
val: unknown
): val is { system: string; messages: AnthropicChatMessage[] } {
@@ -116,7 +116,7 @@ export class SSEStreamAdapter extends Transform {
try {
const hasParts = candidates[0].content?.parts?.length > 0;
if (hasParts) {
return `data: ${JSON.stringify(data)}`;
return `data: ${JSON.stringify(data.value ?? data)}\n`;
} else {
this.log.error({ event: data }, "Received bad Google AI event");
return `data: ${buildSpoofedSSE({