发布

  • [OPIK-4697] Project create permission (#5552)

    frostbyte_neo 发布于 2026-03-11 09:52:09 +00:00

    • [OPIK-4697] Add new permission

    • [OPIK-4697] Guard project creation triggers

    • [OPIK-4697] Handle playground

    • [OPIK-4697] Do not allow running in playground if project not exist

    • [OPIK-4697] Do not allow editing projects

    • [OPIK-4197] [E2E] test: validate Python SDK terminal link navigates to project traces page (#5573)

    • add method for logging traces and extracting url from terminal

    • add fixture for creating traces with getting url

    • add test for validating url from terminal

    • [OPIK-4870] [SDK] Fix prompt commit not injected into trace metadata (#5585)

    • [OPIK-4870] [SDK] Fix prompt commit not injected into trace metadata

    When a Prompt or PromptVersionDetail field is accessed on an agent config
    instance inside an active trace, the metadata injection was recording the
    raw Python object instead of the commit hash string.

    Added python_value_to_metadata_value helper in type_helpers that converts
    prompt/prompt_version values to their commit string, leaving all other
    types unchanged. Updated _inject_trace_metadata in the decorator to use it.
    Added unit test to cover the regression.

    • extend tests to all types

    • [OPIK-4801] [SDK] Add migration manifest for resumable opik import (#5528)

    • [SDK] Add migration manifest for resumable opik import

    Adds a migration_manifest.json to the import directory so that
    interrupted imports can be resumed without creating duplicates.

    • New MigrationManifest class: atomic JSON state file tracking
      completed files, failed files, and src→dest trace ID mappings
    • Auto-detected on import startup: resumes if in_progress, blocks
      re-import if completed (unless --force is given)
    • Added --force flag to all four import subcommands
    • Trace ID map is persisted to disk after each file so experiment
      cross-references survive a resume across separate invocations
    • 20 new unit tests covering lifecycle, file tracking, ID persistence,
      atomic writes, and interrupted+resumed migration scenarios

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • [DOCS] Update import/export CLI docs for migration manifest and --force
    • Documents the new --force flag on all opik import subcommands
    • Explains the migration_manifest.json and automatic resume behaviour
    • Adds the migration_manifest.json to the file structure diagram
    • Replaces the "Project Migration" use case with a proper two-installation
      migration section that shows how to use different API keys for source
      and destination
    • Adds three new troubleshooting entries for interrupted imports,
      "already completed" message, and missing experiment items

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • [SDK] Address PR review comments on migration manifest
    • Remove redundant if debug: guard around debug_print in experiment.py
    • Replace direct console.print with debug_print in project.py for consistency
    • Restore removed explanatory comments in project.py span processing logic
    • Restore removed examples in import_group docstring (dataset import, custom path)

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Address PR review comments from petrotiurin
    • Restore missing project import examples (name pattern and --debug) in __init__.py
    • Restore removed "# Create span with parent_span_id if available" comment in project.py
    • Replace redundant if debug: console.print(...) blocks with debug_print() in project.py
    • Remove redundant if debug: guards wrapping single debug_print() calls in experiment.py

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Batch manifest writes to reduce disk I/O during large imports

    Instead of rewriting migration_manifest.json on every file completion,
    accumulate changes and flush every 10 files (DEFAULT_BATCH_SIZE).
    State-transition calls (start, complete, reset, save) always flush
    immediately to keep lifecycle semantics correct.

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Replace JSON migration manifest with SQLite database
    • Use migration_manifest.db (SQLite) instead of migration_manifest.json
    • WAL mode + synchronous=NORMAL: crash-safe, fast appends, no full-file rewrites
    • Batched writes: buffer up to 50 ops in memory, commit in one transaction
    • INSERT OR IGNORE / INSERT OR REPLACE: idempotent — no duplicate rows possible
    • In-memory buffers use set/dict: deduplication before hitting SQLite, O(1) lookup
    • is_file_completed checks buffer first then keyed DB lookup (O(log n) vs O(n) list scan)
    • del provides best-effort flush on GC for clean process exits
    • Public API unchanged: all callers require no modification
    • Update docs and __init__.py docstring to reference .db filename
    • Rewrite tests: replace JSON-parsing assertions with SQLite queries and API calls;
      add TestDatabaseIntegrity suite covering idempotency and last-write-wins semantics

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Update import docs: SQLite manifest, remove JSON corruption note

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Address baz review comments on migration manifest

    High: document and test the batching crash trade-off

    • Add TestBatchingBehavior suite with 4 tests: buffered writes visible via API,
      crash simulation (unflushed data lost), batch_size=1 per-file durability,
      auto-flush at batch threshold
    • Expand module docstring with explicit crash trade-off section

    Medium: do not create manifest DB during --dry-run

    • MigrationManifest is now constructed only inside if not dry_run: in
      _import_by_type; --dry-run passes manifest=None to all import functions
      (they already guard with if manifest:)
    • Add assert to satisfy mypy at the manifest.complete() call site

    Low: make DEFAULT_BATCH_SIZE env-configurable

    • Read OPIK_MIGRATION_BATCH_SIZE env var at import time; validate range 1-10000;
      log a warning and fall back to 50 on invalid input

    Low: rename tests to follow test_WHAT__CASE__EXPECTED_RESULT convention

    • All 26 test methods now follow the pattern required by design/TESTING.md

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com


    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com
    Co-authored-by: Douglas Blank doug@comet.com

    • [OPIK-3519] [INFRA] add automated provider model sync script (#5506)

    • [OPIK-3519] [BE][FE] feat: add automated provider model sync script

    Add a Python script and GitHub Actions workflow to automatically sync
    LLM provider model lists across 5 Java enums and 2 TypeScript files.

    • Supports OpenAI, Anthropic, Gemini, VertexAI, and OpenRouter providers
    • Fetches models from provider APIs (with fallback to LiteLLM prices JSON)
    • Add-only mode: never removes models automatically, reports stale models
    • Curated dropdown filtering with smart sorting per provider
    • Detects deprecated models via deprecation_date and excludes from dropdown
    • Excludes Responses-API-only models (e.g. gpt-5.2-pro) from dropdown
    • Generates PRs with detailed summary of changes
    • Scheduled daily via GitHub Actions cron

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

    • fix(ci): align workflow PR template with Opik conventions

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

    • fix: address PR review comments
    • Add permissions block (contents: write, pull-requests: write) to workflow
    • Surface sync summary in GitHub Step Summary even when no models are added
    • Fix _deduplicate_by_base to pick newest dated variant instead of oldest
    • Report enum name collisions in sync summary instead of silently skipping

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

    • fix: pipefail for workflow exit code + openrouter deprecated prefix
    • Use PIPESTATUS[0] with pipefail so Python exit code is captured
      instead of tee's (always-zero) exit
    • Add openrouter/ to build_deprecated_set prefix list so deprecated
      OpenRouter models are filtered from dropdown

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com


    Co-authored-by: Andrei Căutișanu andreicautisanu@Andreis-MacBook-Pro.local
    Co-authored-by: Claude Opus 4.6 noreply@anthropic.com

    • [OPIK-4865] [BE] Add NONE value type to AgentConfigValue (#5584)

    • [OPIK-4865] [BE] Add NONE value type to AgentConfigValue

    Adds a new none ValueType to represent the absence of a value on the
    caller side. The value field is now validated with @NotNull instead
    of @NotBlank, allowing an empty string as a placeholder when type is
    none. Updates the validation test to assert the correct error message.

    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    • Allow null in values instead of having a separate type

    • update rollback comment

    • expand tests

    • using assertion util


    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com

    • [OPIK-4871] [BE] Update feedback scores filter to support plural exclude categories (#5588)

    • [OPIK-4871] [BE] Update feedback scores filter to support plural exclude categories

    Switch exclude_category_name (singular) to exclude_category_names (plural, JSON
    array query param parsed to Set). Default to excluding "suite_assertion"
    when no param is provided.

    Affected endpoints:

    • GET /experiments/feedback-scores/names
    • GET /traces/feedback-scores/names
    • GET /spans/feedback-scores/names

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

    • [OPIK-4871] [DOCS] Add API Design guidance for plural query parameter names

    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com


    Co-authored-by: Claude Opus 4.6 noreply@anthropic.com

    • [OPIK-4699] [FE] Write comments permission (#5587)

    • [OPIK-4699] Add new permission

    • [OPIK-4699] Hide comment forms

    • [OPIK-4699] Refactor

    • [OPIK-4699] Hide Reply CTA

    • [OPIK-4699] Hide comment menu

    • [OPIK-4699] Address review comments

    • [OPIK-4710] [FE] Create annotation queue permission (#5590)

    • [OPIK-4710] Add new permission

    • [OPIK-4710] Hide create CTAs

    • [DND-518][HELM] Add support for topologySpreadConstraints in Opik chart (#5580)


    Co-authored-by: Natalia 35889405+NatZol@users.noreply.github.com
    Co-authored-by: Petro Tiurin 2856640+petrotiurin@users.noreply.github.com
    Co-authored-by: Douglas Blank doug.blank@gmail.com
    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com
    Co-authored-by: Douglas Blank doug@comet.com
    Co-authored-by: Andrei Cautisanu 30831438+AndreiCautisanu@users.noreply.github.com
    Co-authored-by: Andrei Căutișanu andreicautisanu@Andreis-MacBook-Pro.local
    Co-authored-by: Daniel Dimenshtein danield@comet.com
    Co-authored-by: Liya Katz liyak@comet.com

    下载附件