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
8 changes: 8 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
repos:
- repo: local
hooks:
- id: gitleaks-pre-commit
name: gitleaks git (staged only)
entry: echo "aloha"
language: system
pass_filenames: false
304 changes: 152 additions & 152 deletions api/poetry.lock

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "api"
version = "0.55.1"
version = "0.55.2"
description = "Agenta API"
authors = [{ name = "Mahmoud Mabrouk", email = "mahmoud@agenta.ai" }]

Expand Down Expand Up @@ -68,6 +68,7 @@ googleapis-common-protos = ">=1.60.0"
h11 = ">=0.16.0"
ecdsa = "^0.19.1"
gunicorn = "^23.0.0"
tiktoken = "0.11.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.3.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,7 @@
"id": "02fa644e",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"os.environ[\"AGENTA_API_KEY\"] = \"\"\n",
"os.environ[\"AGENTA_HOST\"] = \"http://cloud.agenta.ai/\"\n"
]
"source": "import os\n\nos.environ[\"AGENTA_API_KEY\"] = \"\"\nos.environ[\"AGENTA_HOST\"] = \"https://cloud.agenta.ai/\""
},
{
"cell_type": "code",
Expand Down Expand Up @@ -828,4 +823,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
1,247 changes: 621 additions & 626 deletions examples/jupyter/prompt-management/manage-prompts-with-sdk-tutorial.ipynb

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sdk/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion sdk/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "agenta"
version = "0.55.1"
version = "0.55.2"
description = "The SDK for agenta is an open-source LLMOps platform."
readme = "README.md"
authors = ["Mahmoud Mabrouk <mahmoud@agenta.ai>"]
Expand Down Expand Up @@ -42,6 +42,8 @@ huggingface-hub = "<0.31.0"
h11 = ">=0.16.0"
decorator = "^5.2.1"
openai = ">=1.100.0"
tiktoken = "0.11.0"


[tool.poetry.group.dev.dependencies]
posthog = "^3.1.0"
Expand Down
2 changes: 1 addition & 1 deletion web/oss/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@agenta/oss",
"version": "0.55.1",
"version": "0.55.2",
"private": true,
"engines": {
"node": ">=18"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
import {useEffect, useRef, useState} from "react"
import {useCallback, useEffect, useRef, useState} from "react"

import {Splitter} from "antd"
import {Splitter, Spin} from "antd"
import {useAtomValue, useSetAtom} from "jotai"
import dynamic from "next/dynamic"

import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer"
import useTraceDrawer from "@/oss/components/pages/observability/drawer/hooks/useTraceDrawer"
import TraceSidePanel from "@/oss/components/pages/observability/drawer/TraceSidePanel"
import {useObservability} from "@/oss/state/newObservability"
import {useQueryParamState} from "@/oss/state/appState"
import {clearTraceParamAtom} from "@/oss/state/url"

import {isDrawerOpenAtom, closeTraceDrawerAtom} from "./store/traceDrawerStore"
import {
isDrawerOpenAtom,
closeTraceDrawerAtom,
setTraceDrawerActiveSpanAtom,
setTraceDrawerTraceAtom,
} from "./store/traceDrawerStore"

const TraceContent = dynamic(
() => import("@/oss/components/pages/observability/drawer/TraceContent"),
Expand All @@ -20,67 +27,96 @@ const TraceTree = dynamic(() => import("@/oss/components/pages/observability/dra
const TraceDrawer = () => {
const open = useAtomValue(isDrawerOpenAtom)
const closeDrawer = useSetAtom(closeTraceDrawerAtom)
const clearTraceParam = useSetAtom(clearTraceParamAtom)
const [selected, setSelected] = useState("")
const {
traces,
navigationIds: payloadNavIds,
activeTraceId: payloadActiveId,
getTraceById,
} = useTraceDrawer()
const {traces, activeSpanId, getTraceById, traceResponse, error, isLoading, traceId} =
useTraceDrawer()
const [drawerWidth] = useState(1200)

const [isAnnotationsSectionOpen, setIsAnnotationsSectionOpen] = useState(true)
const {setSelectedTraceId: setGlobalSelectedTraceId, setSelectedNode: setGlobalSelectedNode} =
useObservability()
const {
traceTabs,
filters,
sort,
limit,
setSelectedTraceId: setGlobalSelectedTraceId,
setSelectedNode: setGlobalSelectedNode,
} = useObservability()
const setActiveSpan = useSetAtom(setTraceDrawerActiveSpanAtom)
const setTraceDrawerTrace = useSetAtom(setTraceDrawerTraceAtom)
const [, setTraceQueryParam] = useQueryParamState("trace")
const [, setSpanQueryParam] = useQueryParamState("span")

// Initialize selection when drawer payload changes
const lastPayloadActiveIdRef = useRef<string | undefined>(undefined)

useEffect(() => {
if (payloadActiveId) {
const hasChanged = lastPayloadActiveIdRef.current !== payloadActiveId
lastPayloadActiveIdRef.current = payloadActiveId

if (hasChanged || !selected) {
setSelected(payloadActiveId)
}
const incomingId = activeSpanId || traces[0]?.span_id || ""
if (!incomingId) {
setSelected("")
lastPayloadActiveIdRef.current = undefined
return
}

if (!selected && traces.length > 0) {
setSelected(traces[0]?.span_id || "")
const hasChanged = lastPayloadActiveIdRef.current !== incomingId
lastPayloadActiveIdRef.current = incomingId

if (hasChanged || !selected) {
setSelected(incomingId)
}
}, [payloadActiveId, traces, selected])
}, [activeSpanId, traces, selected])

// If current selection is not found in the latest traces (e.g., user clicked a different row), re-anchor
useEffect(() => {
if (selected && traces.length > 0) {
const exists = getTraceById(selected)
if (!exists) {
setSelected(payloadActiveId || traces[0]?.span_id || "")
setSelected(activeSpanId || traces[0]?.span_id || "")
}
}
}, [selected, traces, payloadActiveId, getTraceById])
}, [selected, traces, activeSpanId, getTraceById])

// Keep component mounted; EnhancedDrawer handles destroyOnHidden. We gate heavy work via memos.
useEffect(() => {
if (selected) {
setActiveSpan(selected)
setSpanQueryParam(selected, {shallow: true})
} else {
setSpanQueryParam(undefined, {shallow: true})
}
}, [selected, setActiveSpan, setSpanQueryParam])

const navigationIds =
payloadNavIds && payloadNavIds.length > 1
? payloadNavIds
: traces?.length
? traces.map((t: any) => t.span_id)
: []
// Keep component mounted; EnhancedDrawer handles destroyOnHidden. We gate heavy work via memos.

const activeId = selected || traces[0]?.span_id || ""
const activeTrace = getTraceById(activeId)

const handleAfterOpenChange = useCallback(
(isOpen: boolean) => {
if (!isOpen) {
clearTraceParam()
setSpanQueryParam(undefined, {shallow: true})
}
},
[clearTraceParam, setSpanQueryParam],
)

return (
<EnhancedDrawer
title={
<TraceHeader
activeTrace={activeTrace as any}
activeTraceId={activeId}
navigationIds={navigationIds}
traceId={traceId}
traces={traces as any}
traceTabs={traceTabs}
filters={filters}
sort={sort}
limit={limit}
setSelectedTraceId={setGlobalSelectedTraceId}
setSelectedNode={setGlobalSelectedNode}
setTraceParam={setTraceQueryParam}
setSpanParam={setSpanQueryParam}
setTraceDrawerTrace={setTraceDrawerTrace}
activeTraceIndex={0}
setIsAnnotationsSectionOpen={setIsAnnotationsSectionOpen}
isAnnotationsSectionOpen={isAnnotationsSectionOpen}
Expand All @@ -91,25 +127,41 @@ const TraceDrawer = () => {
onClose={closeDrawer}
width={drawerWidth}
closeOnLayoutClick={false}
afterOpenChange={handleAfterOpenChange}
className="[&_.ant-drawer-body]:p-0"
>
<Splitter className="h-[calc(100%-48px)]">
<Splitter.Panel defaultSize={320} collapsible>
<TraceTree
activeTraceId={activeId}
selected={activeId}
setSelected={setSelected}
/>
</Splitter.Panel>
<Splitter.Panel min={400} defaultSize={640}>
<TraceContent activeTraceId={activeId} />
</Splitter.Panel>
{isAnnotationsSectionOpen && (
<Splitter.Panel min={200} defaultSize={320} collapsible>
<TraceSidePanel activeTraceId={activeId} />
</Splitter.Panel>
)}
</Splitter>
<div className="h-full w-full">
<Spin spinning={Boolean(isLoading)} tip="Loading trace…" size="large">
<div className="h-full">
<Splitter className="h-[calc(100%-48px)]">
<Splitter.Panel defaultSize={320} collapsible>
<TraceTree
activeTraceId={activeId}
selected={activeId}
setSelected={setSelected}
/>
</Splitter.Panel>
<Splitter.Panel min={400} defaultSize={640}>
<TraceContent
activeTrace={activeTrace as any}
traceResponse={traceResponse}
error={error as any}
isLoading={isLoading}
/>
</Splitter.Panel>
{isAnnotationsSectionOpen && (
<Splitter.Panel min={200} defaultSize={320} collapsible>
<TraceSidePanel
activeTrace={activeTrace as any}
activeTraceId={activeId}
isLoading={isLoading}
/>
</Splitter.Panel>
)}
</Splitter>
</div>
</Spin>
</div>
</EnhancedDrawer>
)
}
Expand Down
Loading