Repository navigation
Add an ElevenLabs conversation importer - #1253
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3239ba51f7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return | ||
| since, until = parsed.get_window() | ||
| params: dict[str, Any] = { | ||
| "call_start_after_unix": math.floor(since.timestamp()), |
There was a problem hiding this comment.
Include conversations exactly at the lower time bound
When since falls on a whole second, this sends that same timestamp to ElevenLabs' strictly-after call_start_after_unix filter. A conversation starting exactly at since can therefore be omitted from the listing and never reach the exact since <= started_at < until check below. Use a coarse lower bound before the requested second (for example, floor(since) - 1) and retain the detail-response filter.
Useful? React with 👍 / 👎.
What changes
Add
kitaru-elevenlabs-importer, a separately packaged, non-default importer for ElevenLabs Agents conversations. It parses full conversation exports, batches, and saved transcription webhook payloads, and fetches existing conversations through the ElevenLabs API. Each conversation becomes one Kitaru session with transcript events, matched tool calls/results, interruptions, source analysis, and reported usage.Tool execution errors remain failed nodes; a successful lookup returning
found: falseremains successful. Transcript events are spans rather than invented LLM requests. Audio availability and an authenticated recording endpoint are retained in metadata; this change does not download audio or add playback or a replay runtime.Reviewer Notes
Five sanitized fixtures come from real voice calls against a fictional test-shop agent. They cover a delivery lookup, two tools in one conversation, a deliberate tool error, interrupted speech, and repeated missing-order lookups. Original provider/account IDs, credentials, and audio are excluded. Inspect the tool joins by request ID, truthful usage accounting, stable deduplication, and bounded API pagination.
The package is wired into the plugin workspace, artifact smoke contract, release inventory, dynamic CI matrix, and the worker's first-party package list. It intentionally remains outside the server-default catalog and quickstart dependencies. Setup and limitations live in the package README until publication; public provider docs can follow the release.
Reproduction
The error fixture imports as a completed conversation containing a failed
get_ordernode. The package README also provides exact candidate-wheel registration and file/API import commands for a local server and worker.Validation
just check, plugin Ruff/ty checks, dependency audit, and fulljust plugin-artifact-smokepassed.[api]extra. Candidate resolution was exercised with a dependency cutoff predating the new package.Release context
New distribution metadata starts at
0.1.0, with the existingkitaru>=0.27.0parser/fetch contract. Existing package versions and default pins are unchanged. The importer is intended for the next applicable plugin release; the worker package-inventory update is intended for the next applicable core release. Publication, PyPI Trusted Publisher setup, and any default-catalog inclusion remain separate release work. Local candidate-wheel verification does not claim that an unpublished package resolves from PyPI.