feat(platform): Display error message on save failure

zamilmajdy/open-1984-agentinputblock-and-agentoutputblocks-name-field-should-be
Zamil Majdy 2024-11-04 20:42:17 +07:00
parent eb1e53aba3
commit 89d563dff0
3 changed files with 23 additions and 27 deletions

View File

@ -10,7 +10,7 @@ from prisma.types import AgentGraphInclude
from pydantic import BaseModel from pydantic import BaseModel
from pydantic_core import PydanticUndefinedType from pydantic_core import PydanticUndefinedType
from backend.blocks.basic import AgentInputBlock, AgentOutputBlock from backend.blocks.basic import AgentInputBlock, AgentOutputBlock, BlockType
from backend.data.block import BlockInput, get_block, get_blocks from backend.data.block import BlockInput, get_block, get_blocks
from backend.data.db import BaseDbModel, transaction from backend.data.db import BaseDbModel, transaction
from backend.data.execution import ExecutionStatus from backend.data.execution import ExecutionStatus
@ -209,16 +209,15 @@ class Graph(GraphMeta):
if block is None: if block is None:
raise ValueError(f"Invalid block {node.block_id} for node #{node.id}") raise ValueError(f"Invalid block {node.block_id} for node #{node.id}")
if not for_run:
continue # Skip input completion validation, unless when executing.
provided_inputs = set( provided_inputs = set(
[sanitize(name) for name in node.input_default] [sanitize(name) for name in node.input_default]
+ [sanitize(link.sink_name) for link in node.input_links] + [sanitize(link.sink_name) for link in node.input_links]
) )
for name in block.input_schema.get_required_fields(): for name in block.input_schema.get_required_fields():
if name not in provided_inputs and not isinstance( if name not in provided_inputs and (
block, AgentInputBlock for_run # Skip input completion validation, unless when executing.
or block.block_type == BlockType.INPUT
or block.block_type == BlockType.OUTPUT
): ):
raise ValueError( raise ValueError(
f"Node {block.name} #{node.id} required input missing: `{name}`" f"Node {block.name} #{node.id} required input missing: `{name}`"

View File

@ -70,19 +70,17 @@ async def health():
return {"status": "healthy"} return {"status": "healthy"}
app = starlette.middleware.cors.CORSMiddleware(
app=app,
allow_origins=settings.config.backend_cors_allow_origins,
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
class AgentServer(backend.util.service.AppProcess): class AgentServer(backend.util.service.AppProcess):
def run(self): def run(self):
server_app = starlette.middleware.cors.CORSMiddleware(
app=app,
allow_origins=settings.config.backend_cors_allow_origins,
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
uvicorn.run( uvicorn.run(
app, server_app,
host=backend.util.settings.Config().agent_api_host, host=backend.util.settings.Config().agent_api_host,
port=backend.util.settings.Config().agent_api_port, port=backend.util.settings.Config().agent_api_port,
) )

View File

@ -5,7 +5,7 @@ from contextlib import asynccontextmanager
import uvicorn import uvicorn
from autogpt_libs.auth import parse_jwt_token from autogpt_libs.auth import parse_jwt_token
from fastapi import Depends, FastAPI, WebSocket, WebSocketDisconnect from fastapi import Depends, FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware from starlette.middleware.cors import CORSMiddleware
from backend.data import redis from backend.data import redis
from backend.data.queue import AsyncRedisExecutionEventBus from backend.data.queue import AsyncRedisExecutionEventBus
@ -31,15 +31,6 @@ docs_url = "/docs" if settings.config.app_env == AppEnvironment.LOCAL else None
app = FastAPI(lifespan=lifespan, docs_url=docs_url) app = FastAPI(lifespan=lifespan, docs_url=docs_url)
_connection_manager = None _connection_manager = None
logger.info(f"CORS allow origins: {settings.config.backend_cors_allow_origins}")
app.add_middleware(
CORSMiddleware,
allow_origins=settings.config.backend_cors_allow_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def get_connection_manager(): def get_connection_manager():
global _connection_manager global _connection_manager
@ -176,8 +167,16 @@ async def websocket_router(
class WebsocketServer(AppProcess): class WebsocketServer(AppProcess):
def run(self): def run(self):
logger.info(f"CORS allow origins: {settings.config.backend_cors_allow_origins}")
server_app = CORSMiddleware(
app=app,
allow_origins=settings.config.backend_cors_allow_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
uvicorn.run( uvicorn.run(
app, server_app,
host=Config().websocket_server_host, host=Config().websocket_server_host,
port=Config().websocket_server_port, port=Config().websocket_server_port,
) )