Spaces:
Running
Running
| /** | |
| * Copyright 2024 Google LLC | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| import type { | |
| Content, | |
| FunctionCall, | |
| GenerationConfig, | |
| GenerativeContentBlob, | |
| Part, | |
| Tool, | |
| } from "@google/generative-ai"; | |
| /** | |
| * this module contains type-definitions and Type-Guards | |
| */ | |
| // Type-definitions | |
| /* outgoing types */ | |
| /** | |
| * the config to initiate the session | |
| */ | |
| export type LiveConfig = { | |
| model: string; | |
| systemInstruction?: { parts: Part[] }; | |
| generationConfig?: Partial<LiveGenerationConfig>; | |
| tools?: Array<Tool | { googleSearch: {} } | { codeExecution: {} }>; | |
| }; | |
| export type LiveGenerationConfig = GenerationConfig & { | |
| responseModalities: "text" | "audio" | "image"; | |
| speechConfig?: { | |
| voiceConfig?: { | |
| prebuiltVoiceConfig?: { | |
| voiceName: "Puck" | "Charon" | "Kore" | "Fenrir" | "Aoede" | string; | |
| }; | |
| }; | |
| }; | |
| }; | |
| export type LiveOutgoingMessage = | |
| | SetupMessage | |
| | ClientContentMessage | |
| | RealtimeInputMessage | |
| | ToolResponseMessage; | |
| export type SetupMessage = { | |
| setup: LiveConfig; | |
| }; | |
| export type ClientContentMessage = { | |
| clientContent: { | |
| turns: Content[]; | |
| turnComplete: boolean; | |
| }; | |
| }; | |
| export type RealtimeInputMessage = { | |
| realtimeInput: { | |
| mediaChunks: GenerativeContentBlob[]; | |
| }; | |
| }; | |
| export type ToolResponseMessage = { | |
| toolResponse: { | |
| functionResponses: LiveFunctionResponse[]; | |
| }; | |
| }; | |
| export type ToolResponse = ToolResponseMessage["toolResponse"]; | |
| export type LiveFunctionResponse = { | |
| response: object; | |
| id: string; | |
| }; | |
| /** Incoming types */ | |
| export type LiveIncomingMessage = | |
| | ToolCallCancellationMessage | |
| | ToolCallMessage | |
| | ServerContentMessage | |
| | SetupCompleteMessage; | |
| export type SetupCompleteMessage = { setupComplete: {} }; | |
| export type ServerContentMessage = { | |
| serverContent: ServerContent; | |
| }; | |
| export type ServerContent = ModelTurn | TurnComplete | Interrupted; | |
| export type ModelTurn = { | |
| modelTurn: { | |
| parts: Part[]; | |
| }; | |
| }; | |
| export type TurnComplete = { turnComplete: boolean }; | |
| export type Interrupted = { interrupted: true }; | |
| export type ToolCallCancellationMessage = { | |
| toolCallCancellation: { | |
| ids: string[]; | |
| }; | |
| }; | |
| export type ToolCallCancellation = | |
| ToolCallCancellationMessage["toolCallCancellation"]; | |
| export type ToolCallMessage = { | |
| toolCall: ToolCall; | |
| }; | |
| export type LiveFunctionCall = FunctionCall & { | |
| id: string; | |
| }; | |
| /** | |
| * A `toolCall` message | |
| */ | |
| export type ToolCall = { | |
| functionCalls: LiveFunctionCall[]; | |
| }; | |
| /** log types */ | |
| export type StreamingLog = { | |
| date: Date; | |
| type: string; | |
| count?: number; | |
| message: string | LiveOutgoingMessage | LiveIncomingMessage; | |
| }; | |
| // Type-Guards | |
| const prop = (a: any, prop: string, kind: string = "object") => | |
| typeof a === "object" && typeof a[prop] === "object"; | |
| // outgoing messages | |
| export const isSetupMessage = (a: unknown): a is SetupMessage => | |
| prop(a, "setup"); | |
| export const isClientContentMessage = (a: unknown): a is ClientContentMessage => | |
| prop(a, "clientContent"); | |
| export const isRealtimeInputMessage = (a: unknown): a is RealtimeInputMessage => | |
| prop(a, "realtimeInput"); | |
| export const isToolResponseMessage = (a: unknown): a is ToolResponseMessage => | |
| prop(a, "toolResponse"); | |
| // incoming messages | |
| export const isSetupCompleteMessage = (a: unknown): a is SetupCompleteMessage => | |
| prop(a, "setupComplete"); | |
| export const isServerContentMessage = (a: any): a is ServerContentMessage => | |
| prop(a, "serverContent"); | |
| export const isToolCallMessage = (a: any): a is ToolCallMessage => | |
| prop(a, "toolCall"); | |
| export const isToolCallCancellationMessage = ( | |
| a: unknown, | |
| ): a is ToolCallCancellationMessage => | |
| prop(a, "toolCallCancellation") && | |
| isToolCallCancellation((a as any).toolCallCancellation); | |
| export const isModelTurn = (a: any): a is ModelTurn => | |
| typeof (a as ModelTurn).modelTurn === "object"; | |
| export const isTurnComplete = (a: any): a is TurnComplete => | |
| typeof (a as TurnComplete).turnComplete === "boolean"; | |
| export const isInterrupted = (a: any): a is Interrupted => | |
| (a as Interrupted).interrupted; | |
| export function isToolCall(value: unknown): value is ToolCall { | |
| if (!value || typeof value !== "object") return false; | |
| const candidate = value as Record<string, unknown>; | |
| return ( | |
| Array.isArray(candidate.functionCalls) && | |
| candidate.functionCalls.every((call) => isLiveFunctionCall(call)) | |
| ); | |
| } | |
| export function isToolResponse(value: unknown): value is ToolResponse { | |
| if (!value || typeof value !== "object") return false; | |
| const candidate = value as Record<string, unknown>; | |
| return ( | |
| Array.isArray(candidate.functionResponses) && | |
| candidate.functionResponses.every((resp) => isLiveFunctionResponse(resp)) | |
| ); | |
| } | |
| export function isLiveFunctionCall(value: unknown): value is LiveFunctionCall { | |
| if (!value || typeof value !== "object") return false; | |
| const candidate = value as Record<string, unknown>; | |
| return ( | |
| typeof candidate.name === "string" && | |
| typeof candidate.id === "string" && | |
| typeof candidate.args === "object" && | |
| candidate.args !== null | |
| ); | |
| } | |
| export function isLiveFunctionResponse( | |
| value: unknown, | |
| ): value is LiveFunctionResponse { | |
| if (!value || typeof value !== "object") return false; | |
| const candidate = value as Record<string, unknown>; | |
| return ( | |
| typeof candidate.response === "object" && typeof candidate.id === "string" | |
| ); | |
| } | |
| export const isToolCallCancellation = ( | |
| a: unknown, | |
| ): a is ToolCallCancellationMessage["toolCallCancellation"] => | |
| typeof a === "object" && Array.isArray((a as any).ids); | |