Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 20 additions & 37 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,51 +1,34 @@
# --- Starknet configuration (mandatory) ---
STARKNET_PUBLIC_ADDRESS="YOUR_STARKNET_PUBLIC_ADDRESS"
STARKNET_PRIVATE_KEY="YOUR_STARKNET_PRIVATE_KEY"
STARKNET_RPC_URL="YOUR_STARKNET_RPC_URL"

# --- AI Model API Keys (mandatory) ---
# Add the API keys for the specific AI providers you use in config/models/default.models.json
# The agent will automatically load the correct key based on the provider name.

# Example for OpenAI:
OPENAI_API_KEY="YOUR_OPENAI_API_KEY" # (e.g., sk-...)

# Example for Anthropic:
ANTHROPIC_API_KEY="YOUR_ANTHROPIC_API_KEY" # (e.g., sk-ant-...)

# Example for Google Gemini:
GEMINI_API_KEY="YOUR_GEMINI_API_KEY"

# Example for DeepSeek:
DEEPSEEK_API_KEY="YOUR_DEEPSEEK_API_KEY"

# Note: You do not need an API key if using a local Ollama model.

# --- General Agent Configuration (mandatory) ---
SERVER_API_KEY="YOUR_SERVER_API_KEY" # A secret key for your agent server API
SERVER_PORT="3001"
SERVER_API_KEY="YOUR_SERVER_API_KEY"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SERVER_API_KEY is deprecated

SERVER_PORT="3002"

# --- PostgreSQL Database Configuration (mandatory) ---
POSTGRES_USER=admin
POSTGRES_HOST=localhost # dev
# POSTGRES_HOST=postgres # prod
POSTGRES_HOST=localhost
POSTGRES_DB=postgres
POSTGRES_PASSWORD=admin
POSTGRES_PORT=5432

# --- LangSmith Tracing (Optional) ---
# Set LANGSMITH_TRACING=true to enable tracing
LANGSMITH_TRACING=false
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
LANGSMITH_API_KEY="YOUR_LANGSMITH_API_KEY" # (Only needed if LANGSMITH_TRACING=true)
LANGSMITH_PROJECT="Snak" # (Optional project name for LangSmith)
LANGSMITH_ENDPOINT="https://eu.api.smith.langchain.com/"
LANGSMITH_API_KEY="YOUR_LANGSMITH_API_KEY"
LANGSMITH_PROJECT="Snak"

# --- AI Model Configuration (mandatory) ---
GEMINI_API_KEY="YOUR_GEMINI_API_KEY"
SMITHERY_API_KEY="YOUR_SMITHERY_API_KEY"

# --- Redis Configuration (mandatory) ---
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD="YOUR_REDIS_PASSWORD"
REDIS_DB=0

DEFAULT_MODEL_PROVIDER="your_default_provider" # e.g., "openai", "anthropic", "gemini", "deepseek", "ollama"
DEFAULT_MODEL_NAME="your_default_model_name" # e.g., "gpt-4o", "claude-3", "gemini-1.5", "deepseek-v1", "llama2"
DEFAULT_TEMPERATURE="your_default_temperature" # e.g., "0.7"
DEFAULT_MAX_TOKENS="your_default_max_tokens" # e.g., "4096"
# --- Snak User ID (mandatory) ---
SNAK_USER_ID="YOUR_SNAK_USER_ID"

# --- Node Environment ---
NODE_ENV="development" # "development" or "production"
# --- Default Model Configuration (mandatory) ---
DEFAULT_MODEL_PROVIDER="gemini"
DEFAULT_MODEL_NAME="gemini-2.5-flash"
DEFAULT_TEMPERATURE=0.7
4 changes: 2 additions & 2 deletions config/agents/cairo.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/default.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/ethereum-rpc.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/example.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/memory.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/starknet-rpc.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
4 changes: 2 additions & 2 deletions config/agents/supervisor.agent.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
"execution_timeout_ms": 300000,
"max_token_usage": 100000,
"model": {
"provider": "openai",
"model_name": "gpt-4o",
"provider": "gemini",
"model_name": "gemini-2.5-flash",
"temperature": 0.7,
"max_tokens": 4096
}
Expand Down
6 changes: 2 additions & 4 deletions config/guards/default.guards.json
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,8 @@
"max_execution_timeout_ms": 500000,
"max_token_usage": 200000,
"model": {
"provider_max_length": 100,
"provider_min_length": 3,
"model_name_max_length": 100,
"model_name_min_length": 3,
"allowed_provider": "gemini",
"allowed_models": ["gemini-2.5-flash", "gemini-2.5-pro"],
"max_temperature": 1,
"max_tokens": 8192
}
Comment on lines 105 to 110

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify that schema and validation logic support the new allowlist structure.

The validation strategy has been updated from length-based constraints to explicit allowlists (allowed_provider and allowed_models). This aligns with the PR objective to consolidate to Gemini as the single provider. Ensure that:

  1. The guards schema (guardsSchema.ts) properly validates these new fields
  2. The agent validation service correctly enforces the allowlist constraints
  3. All existing agents using other providers/models are migrated or handled appropriately

Run the following script to verify the guards schema and validation logic:


🏁 Script executed:

#!/bin/bash
# Check guards schema definition
ast-grep --pattern $'allowed_provider'
ast-grep --pattern $'allowed_models'

# Verify validation service enforcement
rg -nP --type=ts -C5 "allowed_provider|allowed_models" packages/core/src/

Length of output: 2216


I need to gather more information about the validation enforcement logic and check for any existing agents that might not conform to the new allowlist. Let me run additional verification:

[/run_scripts]


🏁 Script executed:

#!/bin/bash
# See full validation implementation
cat packages/core/src/services/agent-validation.service.ts | sed -n '268,310p'

# Find where schema is applied (look for parse/safeParse of GuardsSchema or AgentGraphModelConfigSchema)
rg -nP --type=ts "parse|safeParse" packages/core/src/config/guards/ -A2 -B2

# Check if there are other model/provider configurations
rg -nP --type=json "model_provider|allowed_provider" config/

Length of output: 2717


[/run_scripts]


🏁 Script executed:

#!/bin/bash
# Search for other agent configurations with different providers
find config -name "*.json" -type f | xargs grep -l "model_provider\|agents" 2>/dev/null

# Check for any model_provider values other than gemini in config
rg -P "model_provider" config/ -B2 -A2

# Look for agent definitions in graph configs
rg -P "\"agents\"|\"graph\"" config/guards/ -B1 -A1

Length of output: 408


[/run_scripts]


🏁 Script executed:

#!/bin/bash
# Examine agent configuration files
echo "=== default.agent.json ===" 
cat config/agents/default.agent.json | head -50

echo -e "\n=== supervisor.agent.json ===" 
cat config/agents/supervisor.agent.json | head -50

# Look for model_provider in agent configs specifically
rg -P "model_provider" config/agents/ -B2 -A2

Length of output: 4473


[/run_scripts]


🏁 Script executed:

#!/bin/bash
# Find where validateModelConfig is called
rg -nP "validateModelConfig" packages/core/src/ -B3 -A3

# Check if agents are loaded and validated during startup
rg -nP "loadGuardsConfig|validateAgent|validateModelConfig" packages/core/src/ | head -30

# See if there's any migration logic or fallback for existing agents
rg -nP "migrate|fallback|default.*model|openai" config/agents/ -B2 -A2

Length of output: 5219


Migrate all existing agents to use Gemini models before deployment.

The guards schema and validation enforcement are correctly implemented, but all 7 existing agent configurations still use OpenAI (provider="openai", model_name="gpt-4o"). When validateAgent() is called, validation will fail with "Invalid model provider. Only 'gemini' is supported."

Update the following agent files to use "provider": "gemini" and a supported model from allowed_models (e.g., "gemini-2.5-flash" or "gemini-2.5-pro"):

  • config/agents/default.agent.json
  • config/agents/supervisor.agent.json
  • config/agents/starknet-rpc.agent.json
  • config/agents/memory.agent.json
  • config/agents/example.agent.json
  • config/agents/ethereum-rpc.agent.json
  • config/agents/cairo.agent.json
🤖 Prompt for AI Agents
In config/guards/default.guards.json around lines 95-100 the guard restricts
models to provider "gemini" and allowed_models
["gemini-2.5-flash","gemini-2.5-pro"], but seven agent configs still reference
OpenAI, causing validateAgent() to fail; open each of these
files—config/agents/default.agent.json, supervisor.agent.json,
starknet-rpc.agent.json, memory.agent.json, example.agent.json,
ethereum-rpc.agent.json, cairo.agent.json—and change the model provider field to
"gemini" and the model_name (or model) to a supported value such as
"gemini-2.5-flash" (or "gemini-2.5-pro"), save, and re-run validation to ensure
no schema errors remain.

Expand Down
12 changes: 6 additions & 6 deletions config/models/default.models.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
{
"fast": {
"provider": "openai",
"model_name": "gpt-4o-mini",
"provider": "google-genai",
"model_name": "gemini-2.5-flash",
"description": "Optimized for speed and simple tasks.",
"max_input_tokens": 0,
"max_output_tokens": 0
},
"smart": {
"provider": "anthropic",
"model_name": "claude-3-5-sonnet-latest",
"provider": "google-genai",
"model_name": "gemini-2.5-flash",
"description": "Optimized for complex reasoning.",
"max_input_tokens": 0,
"max_output_tokens": 0
},
"cheap": {
"provider": "openai",
"model_name": "gpt-4o-mini",
"provider": "google-genai",
"model_name": "gemini-2.5-flash",
"description": "Good cost-performance balance.",
"max_input_tokens": 0,
"max_output_tokens": 0
Expand Down
140 changes: 76 additions & 64 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ networks:
driver: bridge

services:

postgres:
image: pgvector/pgvector:pg17
container_name: 'postgresql'
Expand Down Expand Up @@ -42,9 +41,23 @@ services:
- redis_data:/data
env_file:
- .env
command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:?REDIS_PASSWORD is required}"]
command:
[
'redis-server',
'--appendonly',
'yes',
'--requirepass',
'${REDIS_PASSWORD:?REDIS_PASSWORD is required}',
]
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:?REDIS_PASSWORD is required}", "ping"]
test:
[
'CMD',
'redis-cli',
'-a',
'${REDIS_PASSWORD:?REDIS_PASSWORD is required}',
'ping',
]
interval: 10s
timeout: 5s
retries: 5
Expand Down Expand Up @@ -77,57 +90,57 @@ services:
- --api.dashboard=true
- --log.level="DEBUG"
ports:
- "443:443"
- "8081:8080" # dashboard
- '443:443'
- '8081:8080' # dashboard
volumes:
- ./keycloak/traefik/dynamic.yml:/etc/traefik/dynamic/dynamic.yml:ro
- ./keycloak/traefik/certs:/certs:ro
networks: [snaknet]

kc_postgres:
image: postgres:15
container_name: kc_postgres
restart: always
env_file:
- keycloak/.env.keycloak
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 3s
retries: 30
volumes:
- kc_postgres_data:/var/lib/postgresql/data
networks: [snaknet]
# kc_postgres:
# image: postgres:15
# container_name: kc_postgres
# restart: always
# env_file:
# - keycloak/.env.keycloak
# healthcheck:
# test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']
# interval: 5s
# timeout: 3s
# retries: 30
# volumes:
# - kc_postgres_data:/var/lib/postgresql/data
# networks: [snaknet]

keycloak:
image: quay.io/keycloak/keycloak:26.0.2
container_name: keycloak
command: ["start", "--import-realm"]
restart: always
depends_on:
kc_postgres:
condition: service_healthy
volumes:
- ./keycloak/realm.json:/opt/keycloak/data/import/realm.json:ro
env_file:
- keycloak/.env.keycloak
networks: [snaknet]
ports:
- "8080:8080"
- "9000:9000"
# keycloak:
# image: quay.io/keycloak/keycloak:26.0.2
# container_name: keycloak
# command: ["start", "--import-realm"]
# restart: always
# depends_on:
# kc_postgres:
# condition: service_healthy
# volumes:
# - ./keycloak/realm.json:/opt/keycloak/data/import/realm.json:ro
# env_file:
# - keycloak/.env.keycloak
# networks: [snaknet]
# ports:
# - "8080:8080"
# - "9000:9000"

oauth2-proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
container_name: oauth2_proxy
restart: always
depends_on:
- keycloak
env_file:
- keycloak/.env.keycloak
networks: [snaknet]
ports:
- "4180:4180"
- "44180:44180"
# oauth2-proxy:
# image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
# container_name: oauth2_proxy
# restart: always
# depends_on:
# - keycloak
# env_file:
# - keycloak/.env.keycloak
# networks: [snaknet]
# ports:
# - "4180:4180"
# - "44180:44180"

# snak-frontend:
# build:
Expand All @@ -151,21 +164,20 @@ services:
# ports:
# - '3001:3001'

snak-frontend:
image: ghcr.io/kasarlabs/snak-app/snak-frontend:latest
container_name: 'snak-frontend'
env_file:
- .env.snak-frontend
networks: [snaknet]
ports:
- '3000:3000'

snak-bff:
image: ghcr.io/kasarlabs/snak-app/snak-bff:latest
container_name: 'snak-bff'
env_file:
- .env.snak-bff
networks: [snaknet]
ports:
- '3001:3001'
# snak-frontend:
# image: ghcr.io/kasarlabs/snak-app/snak-frontend:latest
# container_name: 'snak-frontend'
# env_file:
# - .env.snak-frontend
# networks: [snaknet]
# ports:
# - '3000:3000'

# snak-bff:
# image: ghcr.io/kasarlabs/snak-app/snak-bff:latest
# container_name: 'snak-bff'
# env_file:
# - .env.snak-bff
# networks: [snaknet]
# ports:
# - '3001:3001'
2 changes: 0 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
"private": true,
"packageManager": "pnpm@9.3.0",
"keywords": [
"starknet",
"blockchain",
"AI",
"agent",
Expand Down Expand Up @@ -77,7 +76,6 @@
"pg": "^8.15.6",
"prom-client": "^15.1.3",
"socket.io": "^4.8.1",
"starknet": "^6.24.1",
"util": "^0.12.5",
"uuid": "^11.1.0",
"zod": "^3.25.76"
Expand Down
8 changes: 0 additions & 8 deletions packages/agent/src/__mocks__/@snakagent/core.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,3 @@
export interface ApiKeys {
openai?: string;
anthropic?: string;
gemini?: string;
deepseek?: string;
[providerName: string]: string | undefined;
}

export const logger = {
warn: (..._args: unknown[]): void => {
void _args;
Expand Down
Loading