mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-08 03:00:28 -04:00
Create store agent now working
This commit is contained in:
@@ -8,6 +8,8 @@ import prisma.types
|
||||
import backend.server.v2.store.exceptions
|
||||
import backend.server.v2.store.model
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -276,7 +278,7 @@ async def get_store_submissions(
|
||||
slug=sub.slug,
|
||||
description=sub.description,
|
||||
image_urls=sub.image_urls or [],
|
||||
date_submitted=sub.date_submitted,
|
||||
date_submitted=sub.date_submitted or datetime.now(),
|
||||
status=sub.status,
|
||||
runs=sub.runs or 0,
|
||||
rating=sub.rating or 0.0,
|
||||
@@ -355,7 +357,7 @@ async def create_store_submission(
|
||||
f"Agent not found for user {user_id}: {agent_id} v{agent_version}"
|
||||
)
|
||||
raise backend.server.v2.store.exceptions.AgentNotFoundError(
|
||||
"Agent not found for this user"
|
||||
f"Agent not found for this user. User ID: {user_id}, Agent ID: {agent_id}, Version: {agent_version}"
|
||||
)
|
||||
|
||||
listing = await prisma.models.StoreListing.prisma().find_first(
|
||||
@@ -375,6 +377,7 @@ async def create_store_submission(
|
||||
"agentId": agent_id,
|
||||
"agentVersion": agent_version,
|
||||
"owningUserId": user_id,
|
||||
"createdAt": datetime.now(),
|
||||
"StoreListingVersions": {
|
||||
"create": {
|
||||
"agentId": agent_id,
|
||||
@@ -386,7 +389,7 @@ async def create_store_submission(
|
||||
"description": description,
|
||||
"categories": categories,
|
||||
"subHeading": sub_heading,
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
@@ -95,8 +95,8 @@ SELECT
|
||||
slv.name,
|
||||
slv.description,
|
||||
slv."imageUrls" as image_urls,
|
||||
sls."createdAt" as date_submitted,
|
||||
sls."Status" as status,
|
||||
slv."createdAt" as date_submitted,
|
||||
COALESCE(sls."Status", 'PENDING') as status,
|
||||
COALESCE(ar.run_count, 0) as runs,
|
||||
CAST(COALESCE(AVG(CAST(sr.score AS DECIMAL)), 0.0) AS DOUBLE PRECISION) as rating
|
||||
FROM "StoreListing" sl
|
||||
@@ -109,7 +109,7 @@ LEFT JOIN (
|
||||
GROUP BY "agentGraphId"
|
||||
) ar ON ar."agentGraphId" = sl."agentId"
|
||||
WHERE sl."isDeleted" = FALSE
|
||||
GROUP BY sl.id, sl."owningUserId", slv.slug, slv.name, slv.description, slv."imageUrls",
|
||||
GROUP BY sl.id, sl."owningUserId", slv."createdAt", slv.slug, slv.name, slv.description, slv."imageUrls",
|
||||
sls."createdAt", sls."Status", ar.run_count;
|
||||
|
||||
COMMIT;
|
||||
@@ -22,9 +22,10 @@ export async function login(values: z.infer<typeof loginFormSchema>) {
|
||||
const { data, error } = await supabase.auth.signInWithPassword(values);
|
||||
|
||||
if (error) {
|
||||
console.log("Error logging in", error);
|
||||
if (error.status == 400) {
|
||||
// Hence User is not present
|
||||
redirect("/signup");
|
||||
redirect("/login");
|
||||
}
|
||||
|
||||
return error.message;
|
||||
@@ -33,7 +34,7 @@ export async function login(values: z.infer<typeof loginFormSchema>) {
|
||||
if (data.session) {
|
||||
await supabase.auth.setSession(data.session);
|
||||
}
|
||||
|
||||
console.log("Logged in");
|
||||
revalidatePath("/", "layout");
|
||||
redirect("/");
|
||||
});
|
||||
@@ -55,6 +56,7 @@ export async function signup(values: z.infer<typeof loginFormSchema>) {
|
||||
const { data, error } = await supabase.auth.signUp(values);
|
||||
|
||||
if (error) {
|
||||
console.log("Error signing up", error);
|
||||
if (error.message.includes("P0001")) {
|
||||
return "Please join our waitlist for your turn: https://agpt.co/waitlist";
|
||||
}
|
||||
@@ -67,7 +69,7 @@ export async function signup(values: z.infer<typeof loginFormSchema>) {
|
||||
if (data.session) {
|
||||
await supabase.auth.setSession(data.session);
|
||||
}
|
||||
|
||||
console.log("Signed up");
|
||||
revalidatePath("/", "layout");
|
||||
redirect("/");
|
||||
},
|
||||
|
||||
@@ -17,7 +17,7 @@ interface PublishAgentSelectProps {
|
||||
agents: Agent[];
|
||||
onSelect: (agentId: string, agentVersion: number) => void;
|
||||
onCancel: () => void;
|
||||
onNext: () => void;
|
||||
onNext: (agentId: string, agentVersion: number) => void;
|
||||
onClose: () => void;
|
||||
onOpenBuilder: () => void;
|
||||
}
|
||||
@@ -31,9 +31,13 @@ export const PublishAgentSelect: React.FC<PublishAgentSelectProps> = ({
|
||||
onOpenBuilder,
|
||||
}) => {
|
||||
const [selectedAgent, setSelectedAgent] = React.useState<string | null>(null);
|
||||
const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null);
|
||||
const [selectedAgentVersion, setSelectedAgentVersion] = React.useState<number | null>(null);
|
||||
|
||||
const handleAgentClick = (agentName: string, agentId: string, agentVersion: number) => {
|
||||
setSelectedAgent(agentName);
|
||||
setSelectedAgentId(agentId);
|
||||
setSelectedAgentVersion(agentVersion);
|
||||
onSelect(agentId, agentVersion);
|
||||
};
|
||||
|
||||
@@ -140,8 +144,12 @@ export const PublishAgentSelect: React.FC<PublishAgentSelectProps> = ({
|
||||
Back
|
||||
</Button>
|
||||
<Button
|
||||
onClick={onNext}
|
||||
disabled={!selectedAgent}
|
||||
onClick={() => {
|
||||
if (selectedAgentId && selectedAgentVersion) {
|
||||
onNext(selectedAgentId, selectedAgentVersion);
|
||||
}
|
||||
}}
|
||||
disabled={!selectedAgentId || !selectedAgentVersion}
|
||||
variant="default"
|
||||
size="default"
|
||||
className="w-full bg-neutral-800 text-white hover:bg-neutral-900 sm:flex-1"
|
||||
|
||||
@@ -54,9 +54,16 @@ export const PublishAgentInfo: React.FC<PublishAgentInfoProps> = ({
|
||||
const thumbnailsContainerRef = React.useRef<HTMLDivElement | null>(null);
|
||||
|
||||
const handleRemoveImage = (indexToRemove: number) => {
|
||||
setImages(prev => prev.filter((_, index) => index !== indexToRemove));
|
||||
if (images[indexToRemove] === selectedImage) {
|
||||
setSelectedImage(images[0] || null);
|
||||
const newImages = [...images];
|
||||
newImages.splice(indexToRemove, 1);
|
||||
setImages(newImages);
|
||||
if (newImages[indexToRemove] === selectedImage) {
|
||||
setSelectedImage(newImages[0] || null);
|
||||
}
|
||||
if (newImages.length === 0) {
|
||||
setSelectedImage(null);
|
||||
} else {
|
||||
console.log("images", newImages);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -65,28 +72,41 @@ export const PublishAgentInfo: React.FC<PublishAgentInfoProps> = ({
|
||||
input.type = 'file';
|
||||
input.accept = 'image/*';
|
||||
|
||||
input.onchange = async (e) => {
|
||||
const file = (e.target as HTMLInputElement).files?.[0];
|
||||
if (!file) return;
|
||||
|
||||
try {
|
||||
const api = new AutoGPTServerAPI(
|
||||
process.env.NEXT_PUBLIC_AGPT_SERVER_URL,
|
||||
process.env.NEXT_PUBLIC_AGPT_WS_SERVER_URL,
|
||||
createClient()
|
||||
);
|
||||
|
||||
const imageUrl = await api.uploadStoreSubmissionMedia(file);
|
||||
setImages(prev => [...prev, imageUrl]);
|
||||
if (!selectedImage) {
|
||||
setSelectedImage(imageUrl);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error uploading image:", error);
|
||||
}
|
||||
};
|
||||
// Create a promise that resolves when file is selected
|
||||
const fileSelected = new Promise<File | null>((resolve) => {
|
||||
input.onchange = (e) => {
|
||||
const file = (e.target as HTMLInputElement).files?.[0];
|
||||
resolve(file || null);
|
||||
};
|
||||
});
|
||||
|
||||
// Trigger file selection
|
||||
input.click();
|
||||
|
||||
// Wait for file selection
|
||||
const file = await fileSelected;
|
||||
if (!file) return;
|
||||
|
||||
try {
|
||||
const api = new AutoGPTServerAPI(
|
||||
process.env.NEXT_PUBLIC_AGPT_SERVER_URL,
|
||||
process.env.NEXT_PUBLIC_AGPT_WS_SERVER_URL,
|
||||
createClient()
|
||||
);
|
||||
|
||||
const imageUrl = (await api.uploadStoreSubmissionMedia(file)).replace(/^"(.*)"$/, '$1');
|
||||
|
||||
setImages(prev => {
|
||||
const newImages = [...prev, imageUrl];
|
||||
console.log("Added image. Images now:", newImages);
|
||||
return newImages;
|
||||
});
|
||||
if (!selectedImage) {
|
||||
setSelectedImage(imageUrl);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error uploading image:", error);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSubmit = (e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
@@ -161,7 +181,7 @@ export const PublishAgentInfo: React.FC<PublishAgentInfoProps> = ({
|
||||
Thumbnail images
|
||||
</label>
|
||||
<div className="flex h-[350px] items-center justify-center overflow-hidden rounded-[20px] border border-neutral-300 p-2.5">
|
||||
{selectedImage ? (
|
||||
{selectedImage !== null && selectedImage !== undefined ? (
|
||||
<Image
|
||||
src={selectedImage}
|
||||
alt="Selected Thumbnail"
|
||||
|
||||
@@ -43,6 +43,8 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
slug: "",
|
||||
categories: [],
|
||||
});
|
||||
const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null);
|
||||
const [selectedAgentVersion, setSelectedAgentVersion] = React.useState<number | null>(null);
|
||||
const [open, setOpen] = React.useState(false);
|
||||
|
||||
const popupId = React.useId();
|
||||
@@ -91,8 +93,10 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
setSelectedAgent(agentName);
|
||||
};
|
||||
|
||||
const handleNextFromSelect = () => {
|
||||
const handleNextFromSelect = (agentId: string, agentVersion: number) => {
|
||||
setStep("info");
|
||||
setSelectedAgentId(agentId);
|
||||
setSelectedAgentVersion(agentVersion);
|
||||
};
|
||||
|
||||
const handleNextFromInfo = async (
|
||||
@@ -103,7 +107,6 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
videoUrl: string,
|
||||
categories: string[]
|
||||
) => {
|
||||
const selectedAgentData = myAgents?.agents.find(a => a.agent_name === selectedAgent);
|
||||
|
||||
if (!name || !subHeading || !description || !imageUrls.length || !categories.length) {
|
||||
console.error("Missing required fields");
|
||||
@@ -116,8 +119,8 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
description,
|
||||
image_urls: imageUrls,
|
||||
video_url: videoUrl,
|
||||
agent_id: selectedAgentData?.agent_id || "",
|
||||
agent_version: selectedAgentData?.agent_version || 0,
|
||||
agent_id: selectedAgentId || "",
|
||||
agent_version: selectedAgentVersion || 0,
|
||||
slug: name.toLowerCase().replace(/\s+/g, '-'),
|
||||
categories
|
||||
});
|
||||
@@ -130,8 +133,8 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
description: description,
|
||||
image_urls: imageUrls,
|
||||
video_url: videoUrl,
|
||||
agent_id: selectedAgentData?.agent_id || "",
|
||||
agent_version: selectedAgentData?.agent_version || 0,
|
||||
agent_id: selectedAgentId || "",
|
||||
agent_version: selectedAgentVersion || 0,
|
||||
slug: name.toLowerCase().replace(/\s+/g, '-'),
|
||||
categories: categories
|
||||
});
|
||||
@@ -170,7 +173,7 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||
onCancel={handleClose}
|
||||
onNext={handleNextFromSelect}
|
||||
onClose={handleClose}
|
||||
onOpenBuilder={onOpenBuilder || (() => router.push(`/build?flowID=${myAgents?.agents.find(a => a.agent_name === selectedAgent)?.agent_id}`))}
|
||||
onOpenBuilder={onOpenBuilder || (() => router.push('/build'))}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user