Canvas: Gemini API key validator
Change-Id: If185b7600c3fdd153345ab6f80c1b89f6504ddeb
diff --git a/apps/canvas/front/src/lib/config.ts b/apps/canvas/front/src/lib/config.ts
index f6dee32..e2ad19d 100644
--- a/apps/canvas/front/src/lib/config.ts
+++ b/apps/canvas/front/src/lib/config.ts
@@ -1,12 +1,12 @@
-import { AppNode, NodeType } from "config";
+import { AppNode, Env, NodeType, ServiceNode } from "config";
import { Message, MessageType } from "./state";
export interface Validator {
- (nodes: AppNode[]): Message[];
+ (nodes: AppNode[], env: Env): Message[];
}
function CombineValidators(...v: Validator[]): Validator {
- return (n) => v.flatMap((v) => v(n));
+ return (n, env) => v.flatMap((v) => v(n, env));
}
function MessageTypeToNumber(t: MessageType) {
@@ -44,9 +44,9 @@
}
function SortingValidator(v: Validator): Validator {
- return (n) => {
- const nt = new Map(n.map((n) => [n.id, NodeTypeToNumber(n.type)]));
- return v(n).sort((a, b) => {
+ return (nodes, env) => {
+ const nt = new Map(nodes.map((n) => [n.id, NodeTypeToNumber(n.type)]));
+ return v(nodes, env).sort((a, b) => {
const at = MessageTypeToNumber(a.type);
const bt = MessageTypeToNumber(b.type);
if (a.nodeId === undefined && b.nodeId === undefined) {
@@ -86,6 +86,7 @@
ServiceAnalyzisValidator,
GatewayHTTPSValidator,
GatewayTCPValidator,
+ AgentApiKeyValidator,
),
);
}
@@ -391,3 +392,15 @@
}));
return noNetwork.concat(notConnected);
}
+
+function AgentApiKeyValidator(nodes: AppNode[], env: Env): Message[] {
+ return nodes
+ .filter((n): n is ServiceNode => n.type === "app" && n.data.type === "sketch:latest")
+ .filter((n) => n.data.agent?.geminiApiKey == null && !env.integrations.gemini)
+ .map((n) => ({
+ id: `${n.id}-no-agent-api-key`,
+ type: "FATAL",
+ nodeId: n.id,
+ message: "Configure Gemini API key either on the service or in the project integrations",
+ }));
+}
diff --git a/apps/canvas/front/src/lib/state.ts b/apps/canvas/front/src/lib/state.ts
index b5eac42..8f21c26 100644
--- a/apps/canvas/front/src/lib/state.ts
+++ b/apps/canvas/front/src/lib/state.ts
@@ -322,9 +322,11 @@
setOg(state);
};
const setN = (nodes: AppNode[]) => {
+ const env = get().env;
+ console.log("---env", env);
set({
nodes,
- messages: v(nodes),
+ messages: v(nodes, env),
});
};
@@ -624,7 +626,7 @@
nodes: [],
edges: [],
categories: defaultCategories,
- messages: v([]),
+ messages: [],
env: defaultEnv,
viewport: {
transformX: 0,