Create store agent now working

This commit is contained in:
SwiftyOS
2024-11-27 11:38:10 +01:00
parent 244171d748
commit 3f3919a843
6 changed files with 79 additions and 43 deletions

View File

@@ -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,
}
}
},
}
)

View File

@@ -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;

View File

@@ -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("/");
},

View File

@@ -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"

View File

@@ -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"

View File

@@ -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>