Skip to content
Draft
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
722b808
implemented onboarding feature on the app
ashrafchowdury Nov 17, 2025
d8c851e
fixed codeql issue
ashrafchowdury Nov 17, 2025
dac403b
fixed trace drawer issue
ashrafchowdury Nov 17, 2025
abde757
fixed modal target issues
ashrafchowdury Nov 17, 2025
c779453
implemented steps for online eval creation
ashrafchowdury Nov 17, 2025
72613b1
fix playground step
ashrafchowdury Nov 17, 2025
82cacf5
fixed viewport issue
ashrafchowdury Nov 17, 2025
91ffc44
cleandup evaluation tours
ashrafchowdury Nov 17, 2025
ceb8d8d
fix the failure issue
ashrafchowdury Nov 17, 2025
5b445dd
added steps for online eval detail page
ashrafchowdury Nov 17, 2025
8805bc3
added sme journey
ashrafchowdury Nov 17, 2025
db1508a
fixed issue
ashrafchowdury Nov 17, 2025
a7af7e1
show onboarding for specific pages
ashrafchowdury Nov 17, 2025
2b6a0ce
fixed bugs
ashrafchowdury Nov 17, 2025
c4dbc5e
implemented posthog on onboarding
ashrafchowdury Nov 17, 2025
92d9ef4
fix pnpm file
ashrafchowdury Nov 17, 2025
716953f
fixed constant opening issue
ashrafchowdury Nov 17, 2025
1fbf3e4
fixed issues
ashrafchowdury Nov 19, 2025
11aac7b
Merge branch 'release/v0.62.6' of https://github.com/Agenta-AI/agenta…
ashrafchowdury Nov 19, 2025
c1aec44
fix code
ashrafchowdury Nov 19, 2025
754eb3d
format code
ashrafchowdury Nov 19, 2025
0444cc4
Merge branch 'main' of https://github.com/Agenta-AI/agenta into featu…
ashrafchowdury Nov 25, 2025
9d6bcb9
cleanup
ashrafchowdury Nov 25, 2025
5b9c76c
removed redundend playground steps
ashrafchowdury Nov 25, 2025
b3767e8
fixed issue for finish actions
ashrafchowdury Nov 26, 2025
202c2f0
cleaned up breadcrumb
ashrafchowdury Nov 29, 2025
34114e0
cleaned up old code
ashrafchowdury Nov 29, 2025
2bf80b4
added auto advance step feature
ashrafchowdury Nov 29, 2025
431218b
added widget
ashrafchowdury Nov 29, 2025
b8f4ad7
added extra utils on the onboarding step
ashrafchowdury Nov 30, 2025
d291bbb
refactored code
ashrafchowdury Nov 30, 2025
ae18f0f
triggering steps based on given tour id
ashrafchowdury Nov 30, 2025
ebfdc5d
created online evaluation in one click
ashrafchowdury Nov 30, 2025
b7fac29
made the tracker consistent
ashrafchowdury Nov 30, 2025
0e8fdb3
improved card ui
ashrafchowdury Nov 30, 2025
86c7db3
reverted post-signup changes
ashrafchowdury Nov 30, 2025
075eee3
Merge branch 'main' of https://github.com/Agenta-AI/agenta into featu…
ashrafchowdury Nov 30, 2025
3c0d9c5
added posthog tracker
ashrafchowdury Dec 1, 2025
9088e9e
improved widget reposition
ashrafchowdury Dec 1, 2025
b621e3b
added steps for prompt-management
ashrafchowdury Dec 1, 2025
45d11fc
fixed the arrow
ashrafchowdury Dec 1, 2025
51e9f11
fix bug
ashrafchowdury Dec 1, 2025
96da033
removed floating button
ashrafchowdury Dec 1, 2025
1529dbf
improved card ui
ashrafchowdury Dec 1, 2025
f041074
added a default "LLM-as-a-judge" evaluator on BE
ashrafchowdury Dec 1, 2025
d8e2d84
remove file
ashrafchowdury Dec 1, 2025
9ca0372
removed old auto eval steps code
ashrafchowdury Dec 1, 2025
4b2aef0
cleandup and reverted code changes
ashrafchowdury Dec 1, 2025
3de2014
fix
ashrafchowdury Dec 1, 2025
2d909b1
removed unused steps
ashrafchowdury Dec 2, 2025
43a9410
improved ui
ashrafchowdury Dec 2, 2025
fe8ccc2
added general guild open step
ashrafchowdury Dec 2, 2025
2bf7e3d
Merge branch 'main' of https://github.com/Agenta-AI/agenta into featu…
ashrafchowdury Dec 3, 2025
3a69f70
Merge branch 'release/v0.69.3' into feature/user-onbroading-to-app
mmabrouk Dec 17, 2025
13609c1
Refactor onboarding state management to utilize activePreviewRunIdAto…
mmabrouk Dec 17, 2025
8154da7
Refactor onboarding components to improve code organization and consi…
mmabrouk Dec 17, 2025
e298b60
revert changes to backend
mmabrouk Dec 17, 2025
aa829a4
chore(web): replace nextstepjs patch with @agentaai/nextstepjs package
mmabrouk Dec 31, 2025
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
12 changes: 11 additions & 1 deletion api/oss/src/resources/evaluators/evaluators.py
Copy link
Member

Choose a reason for hiding this comment

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

I don't understand this change

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated this file and evaluator_manager.py to add a default LLM-as-a-judge evaluator. I have done that using AI

Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@
{
"name": "LLM-as-a-judge",
"key": "auto_ai_critique",
"direct_use": False,
"direct_use": True,
"requires_llm_api_keys": True,
"settings_presets": [
{
Expand All @@ -221,6 +221,7 @@
},
],
"model": "gpt-4o-mini",
"template_format": "curly",
"response_type": "json_schema",
"json_schema": {
"name": "schema",
Expand Down Expand Up @@ -323,6 +324,13 @@
"advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default
"description": "The LLM model to use for the evaluation",
},
"template_format": {
"label": "Template Format",
"type": "hidden",
"default": "curly",
"advanced": True,
"description": "Formatting style for prompt variables",
},
"response_type": {
"label": "Response Type",
"default": "json_schema",
Expand Down Expand Up @@ -361,6 +369,8 @@
},
},
"description": "LLM-as-a-judge uses a configurable prompt template that takes the output—and optionally inputs or data from the testcase such as correct answer—to evaluate the generated output.",
"requires_testcase": "always",
"requires_trace": "always",
"oss": True,
"tags": ["ai_llm", "functional"],
},
Expand Down
15 changes: 10 additions & 5 deletions api/oss/src/services/evaluator_manager.py
Copy link
Member

Choose a reason for hiding this comment

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

I don't understand this change

Copy link
Contributor Author

Choose a reason for hiding this comment

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

same answer as the above question

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from oss.src.models.db_models import EvaluatorConfigDB
from oss.src.models.converters import evaluator_config_db_to_pydantic
import copy

from oss.src.resources.evaluators.evaluators import get_all_evaluators
from oss.src.models.api.evaluation_model import LegacyEvaluator, EvaluatorConfig

Expand Down Expand Up @@ -132,15 +134,18 @@ async def create_ready_to_use_evaluators(project_id: str):

for evaluator in direct_use_evaluators:
settings_values = {
setting_name: setting.get("default")
setting_name: copy.deepcopy(setting.get("default"))
for setting_name, setting in evaluator.settings_template.items()
if setting.get("ground_truth_key") is True and setting.get("default", "")
if "default" in setting
}

for setting_name, default_value in settings_values.items():
assert default_value != "", (
f"Default value for ground truth key '{setting_name}' in Evaluator is empty"
)
if evaluator.settings_template.get(setting_name, {}).get(
"ground_truth_key"
):
assert default_value != "", (
f"Default value for ground truth key '{setting_name}' in Evaluator is empty"
)

assert hasattr(evaluator, "name") and hasattr(evaluator, "key"), (
f"'name' and 'key' does not exist in the evaluator: {evaluator}"
Expand Down
5 changes: 4 additions & 1 deletion web/ee/docker/Dockerfile.dev
Copy link
Member

Choose a reason for hiding this comment

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

I don't understand this change

Copy link
Contributor Author

Choose a reason for hiding this comment

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

First check the below asnwer for better context. Since we have added a patch directory, we need to add that on dockerfile as well

Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ COPY ee/package.json ./ee/yarn.lock* ./ee/package-lock.json* ./ee/pnpm-lock.yaml
COPY oss/package.json ./oss/yarn.lock* ./oss/package-lock.json* ./oss/pnpm-lock.yaml* ./oss/.npmrc* ./oss/
COPY ./pnpm-workspace.yaml ./turbo.json ./

COPY ./entrypoint.sh /app/entrypoint.sh
COPY ./entrypoint.sh /app/entrypoint.sh

# Copy patches directory before running pnpm i
COPY ./patches /app/patches/

RUN pnpm i

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {useCallback, useEffect, useRef, useState} from "react"

import {DeploymentRevisionConfig, DeploymentRevisions} from "@agenta/oss/src/lib/types_ee"
import {Button, Card, Divider, Space, Typography, notification} from "antd"
import dayjs from "dayjs"
import duration from "dayjs/plugin/duration"
Expand All @@ -15,8 +16,6 @@ import {
fetchAllDeploymentRevisions,
} from "@/oss/services/deploymentVersioning/api"

import {DeploymentRevisionConfig, DeploymentRevisions} from "@agenta/oss/src/lib/types_ee"

dayjs.extend(relativeTime)
dayjs.extend(duration)

Expand Down
22 changes: 11 additions & 11 deletions web/ee/src/components/PostSignupForm/RunEvaluationView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,9 @@ export const RunEvaluationView = () => {
<div className="flex flex-col gap-8">
<div className="flex flex-col gap-1">
<div className="flex justify-between items-center">
<Title level={1} style={{margin: 0}}>Evaluate from SDK</Title>
<Title level={1} style={{margin: 0}}>
Evaluate from SDK
</Title>
<div className="flex items-center gap-2">
<Button
icon={<Play size={16} className="mt-1" />}
Expand All @@ -98,28 +100,26 @@ export const RunEvaluationView = () => {
</div>
<ApiKeyInput apiKeyValue={apiKeyValue} onApiKeyChange={setApiKeyValue} />


<div className="flex flex-col gap-2">
<Text strong>1. Install the required packages:</Text>
<TracingCodeComponent
<TracingCodeComponent
command={{
title: "Bash",
code: "pip install -U agenta"
}}
index={0}
code: "pip install -U agenta",
}}
index={0}
/>
</div>

<div className="flex flex-col gap-4">
<TracingCodeComponent
<TracingCodeComponent
command={{
title: "Python Code",
code: CODE_SNIPPET
}}
index={1}
code: CODE_SNIPPET,
}}
index={1}
/>
</div>

</div>
)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs"
import duration from "dayjs/plugin/duration"
import relativeTime from "dayjs/plugin/relativeTime"

import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs"
import {SubscriptionType} from "@/oss/services/billing/types"

dayjs.extend(duration)
Expand Down
2 changes: 1 addition & 1 deletion web/ee/src/components/pages/settings/Billing/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ const Billing = () => {

<div className="w-full grid grid-cols-3 gap-4">
{Object.entries(usage)
?.filter(([key]) => (key !== "users" && key !== "applications"))
?.filter(([key]) => key !== "users" && key !== "applications")
?.map(([key, info]) => {
return (
<UsageProgressBar
Expand Down
2 changes: 2 additions & 0 deletions web/oss/docker/Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ RUN PNPM_VERSION=$(cat package.json | jq -r '.packageManager | split("@")[1]') &

COPY oss/package.json ./oss/yarn.lock* ./oss/package-lock.json* ./oss/pnpm-lock.yaml* ./oss/.npmrc* ./oss/
COPY ./pnpm-workspace.yaml ./turbo.json ./
# Copy patches directory before running pnpm i
COPY ./patches /app/patches/
RUN pnpm i

COPY tsconfig.json .
Expand Down
2 changes: 2 additions & 0 deletions web/oss/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,9 @@
"lexical": "^0.38.2",
"lodash": "^4.17.21",
"lucide-react": "^0.475.0",
"motion": "^12.23.24",
"next": "15.5.2",
"nextstepjs": "^2.1.2",
"papaparse": "^5.5.3",
"postcss": "^8.5.6",
"postcss-antd-fixes": "^0.2.0",
Expand Down
23 changes: 13 additions & 10 deletions web/oss/src/components/Common/ImagePreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,34 @@ const ImagePreview = ({
alt = "Preview",
size = 48,
className = "",
isValidPreview=true,
isValidPreview = true,
}: ImagePreviewProps) => {

const [open, setOpen] = useState(false)

const isSafeImageSrc = (url: string) => {
if (!url) return false
// Only allow valid https/http image URLs, blob URLs, or safe data:image URLs
try {
// Block javascript: and other schemes
const lower = url.toLowerCase().trim();
const lower = url.toLowerCase().trim()
// Only allow https/http with proper image extensions
if (/^https?:\/\/[^ "]+$/i.test(lower)) {
// Optional: Allow only image file extensions
if (/\.(png|jpe?g|gif|webp)(\?.*)?$/i.test(lower)) {
// Further checking could be done here (e.g., image mimetype fetch), but for now file extension is checked
return true;
return true
}
// Otherwise, reject
return false;
return false
}
// Allow blob: URLs (browser-generated, controlled)
if (lower.startsWith("blob:")) return true;
if (lower.startsWith("blob:")) return true
// Only allow specific data:image/*;base64 URLs
if (/^data:image\/(png|jpe?g|gif|webp);base64,[a-z0-9+/=]+$/i.test(lower)) return true;
if (/^data:image\/(png|jpe?g|gif|webp);base64,[a-z0-9+/=]+$/i.test(lower)) return true
// Otherwise, reject
return false;
return false
} catch {
return false;
return false
}
}

Expand Down Expand Up @@ -97,7 +96,11 @@ const ImagePreview = ({
height={600}
>
{isValidPreview && isSafeImageSrc(imageURL) && (
<img src={imageURL} alt={alt} className="w-full h-full max-h-[600px] max-w-[800px] object-contain" />
<img
src={imageURL}
alt={alt}
className="w-full h-full max-h-[600px] max-w-[800px] object-contain"
/>
)}
</Modal>
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ import {ComponentProps, ReactNode, useState} from "react"
import {CloseOutlined, FullscreenExitOutlined, FullscreenOutlined} from "@ant-design/icons"
import {Button, Divider, Drawer} from "antd"
import clsx from "clsx"
import {useAtomValue} from "jotai"
import {useAtomValue, useSetAtom} from "jotai"
import {createUseStyles} from "react-jss"

import {envRevisionsAtom} from "@/oss/components/DeploymentsDashboard/atoms"
import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer"
import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation"
import {JSSTheme} from "@/oss/lib/Types"
import {openSelectDeployVariantModalAtom} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore"
import {revisionListAtom} from "@/oss/state/variant/selectors/variant"

import UseApiContent from "../../assets/UseApiContent"
Expand Down Expand Up @@ -99,6 +100,8 @@ const DeploymentsDrawerContent = ({
}: DeploymentsDrawerProps) => {
const variants = useAtomValue(revisionListAtom) || []
const envRevisions = useAtomValue(envRevisionsAtom)
const openSelectDeployVariantModal = useSetAtom(openSelectDeployVariantModalAtom)

return (
<div className="flex h-full">
<div className={`flex-1 overflow-auto ${mainContentClassName}`}>
Expand All @@ -119,7 +122,9 @@ const DeploymentsDrawerContent = ({
>
{envRevisions ? (
<UseApiContent
handleOpenSelectDeployVariantModal={() => close()}
handleOpenSelectDeployVariantModal={() =>
openSelectDeployVariantModal({variants, envRevisions})
}
variants={variants}
revisionId={drawerVariantId}
selectedEnvironment={envRevisions}
Expand Down
1 change: 1 addition & 0 deletions web/oss/src/components/DeploymentsDashboard/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ const DeploymentsDashboard: FC<DeploymentsDashboardProps> = ({
<Button
type="primary"
onClick={() => envRevisions && openDeploymentsDrawer({initialWidth: 720})}
id="tour-setup-prompt"
>
Use API
</Button>
Expand Down
7 changes: 6 additions & 1 deletion web/oss/src/components/Layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@ import CustomWorkflowBanner from "../CustomWorkflowBanner"
import ProtectedRoute from "../ProtectedRoute/ProtectedRoute"

import BreadcrumbContainer from "./assets/Breadcrumbs"
import {useStyles} from "./assets/styles"
import {StyleProps, useStyles} from "./assets/styles"
import ErrorFallback from "./ErrorFallback"
import {SidebarIsland} from "./SidebarIsland"
import {getDeviceTheme, useAppTheme} from "./ThemeContextProvider"

const OnboardingWidget = dynamic(() => import("../Onboarding/components/OnboardingWidget"), {
ssr: false,
loading: () => null,
})
const FooterIsland = dynamic(() => import("./FooterIsland").then((m) => m.FooterIsland), {
ssr: false,
loading: () => null,
Expand Down Expand Up @@ -267,6 +271,7 @@ const App: React.FC<LayoutProps> = ({children}) => {
{children}
{contextHolder}
</AppWithVariants>
<OnboardingWidget />
</ProtectedRoute>
)}
</Suspense>
Expand Down
Loading