Repository navigation
Releases: Kntro-Soft/reqsai-api
Release list
v1.6.0
Promoted to production from candidate 1.6.0-rc.1 without rebuilding.
- Released commit:
5fbacec2adb56a62f79e27584c6ebcb7447fb3c7(treeb7fe661dd1d8d435cbc1f34d2df985b612509641) - Candidate commit:
e336d6d0ec955a155f493d6bf96b0c55334a4373onrelease/1.6.0 - Image:
ghcr.io/kntro-soft/reqsai-api@sha256:044f55ed61efa0849e814166f965b010e0eebebef0a80e1803c51640d590001f - Production: https://reqsai.tech
Changes
Added (AI project profile — feature/153-ai-project-profile, #153)
POST /api/organizations/{orgId}/code/github/project-profile(owners and admins, like the other GitHub endpoints of the organization): for a project that does not exist yet, reads the README and manifests of the picked repositories (at most 3, through the organization's GitHub App, nothing else of the code) plus the picked Jira project's name and description, and has the AI propose a name, description, domain, architecture, languages, frameworks, client platforms and databases covering all the sources ("te-tengo-general-api"and"te-tengo-mobile-flutter"become "Te Tengo"). Needs the AI allowance (402 AI_QUOTA_EXCEEDEDwhen spent), is metered as the newPROJECT_SETUPfeature and treats every source text as untrusted data. Without a model, or when its reply cannot be read, it answers withgenerated: falsefrom the sources' metadata.
v1.6.0-rc.1
Release candidate 1.6.0-rc.1 of Kntro-Soft/reqsai-api (version 1.6.0, build 5).
| Commit | e336d6d0ec955a155f493d6bf96b0c55334a4373 on release/1.6.0 |
| Tree | b7fe661dd1d8d435cbc1f34d2df985b612509641 |
| Built by | https://github.com/Kntro-Soft/reqsai-api/actions/runs/38514021788 |
| Image | ghcr.io/kntro-soft/reqsai-api@sha256:044f55ed61efa0849e814166f965b010e0eebebef0a80e1803c51640d590001f |
| Stage | verified · https://github.com/Kntro-Soft/reqsai-api/actions/runs/38514021788 |
Production ships this candidate only from a main commit whose tree is b7fe661dd1d8d435cbc1f34d2df985b612509641, without rebuilding.
v1.5.0
Promoted to production from candidate 1.5.0-rc.1 without rebuilding.
- Released commit:
524178798ce474acabba8b694f062e65393b8a18(tree022b6739a98a4d04f9f00a9fb521664bcf54db8e) - Candidate commit:
ece3b6018bdfa14bd61a1bb3d7e925f1ec9ef0d7onrelease/1.5.0 - Image:
ghcr.io/kntro-soft/reqsai-api@sha256:e2c3fb642cc344eb14e986e1556c0a4664934453c697d5f938617f3243bffc86 - Production: https://reqsai.tech
Changes
Fixed (Branch cleanup — bugfix/147-branch-cleanup-pulls, #147)
- The weekly branch cleanup read each branch's pull requests with
gh api -f, which sends a POST to the create-pull-request endpoint instead of listing, so every lookup failed with 422 and the open-PR anddo-not-deleteprotections were never checked. It now lists with--method GET, and a branch whose PRs cannot be read is left alone.
Fixed (OpenAPI groups — bugfix/149-openapi-groups, #149)
- Swagger UI now has groups for
codebase(code copilot and GitHub),gateway(Jira integrations),overviewandsearch; before, only workspace, discovery, iam and billing were documented, so those endpoints were missing from/swagger-ui.htmland/api-docs/*.
Fixed (AI allowance gaps — feature/141-quota-gaps, #141)
- Uploading a recording (
POST /api/sessions/{id}/upload), processing a session into stories (POST /api/sessions/{id}/process) and verifying a suggestion against the code (POST /api/projects/{id}/suggestions/{id}/verify-code) now check the monthly AI allowance first and answer402 AI_QUOTA_EXCEEDEDwhen it is spent, before touching the session (it keeps its status). Recording live, transcribing, sharing, exporting and reading are not affected.
Added (Source profile data — feature/145-source-profile, #145)
GET .../integrations/{connectionId}/jira/projectsreturns each project'sdescriptionandGET .../code/github/repositorieseach repository'slanguage, so the create-project wizard can fill the project's profile from the chosen sources.
Changed (Jira sites — feature/143-jira-multi-site, #143)
- An organization can connect several Jira sites, like GitHub accounts. The same site twice (by its normalized URL) is still refused with
409 INTEGRATION_ALREADY_CONNECTED; disconnecting one site leaves the others. Tenant migrationV20261012133000replaces the unique index per organization and provider with one per organization, provider and site. A project's single push target is unchanged.
v1.5.0-rc.1
Release candidate 1.5.0-rc.1 of Kntro-Soft/reqsai-api (version 1.5.0, build 4).
| Commit | ece3b6018bdfa14bd61a1bb3d7e925f1ec9ef0d7 on release/1.5.0 |
| Tree | 022b6739a98a4d04f9f00a9fb521664bcf54db8e |
| Built by | https://github.com/Kntro-Soft/reqsai-api/actions/runs/38507162799 |
| Image | ghcr.io/kntro-soft/reqsai-api@sha256:e2c3fb642cc344eb14e986e1556c0a4664934453c697d5f938617f3243bffc86 |
| Stage | verified · https://github.com/Kntro-Soft/reqsai-api/actions/runs/38507162799 |
Production ships this candidate only from a main commit whose tree is 022b6739a98a4d04f9f00a9fb521664bcf54db8e, without rebuilding.
v1.4.0
Promoted to production from candidate 1.4.0-rc.1 without rebuilding.
- Released commit:
2960a6c8c15917ef1fd3d452088041fc1ab63eb1(treef0bd875942c1052fd9c38f3a18b4bdb0be6f7445) - Candidate commit:
ff95f858608d9f41677bd5fdb4280ed9795ccfe2onrelease/1.4.0 - Image:
ghcr.io/kntro-soft/reqsai-api@sha256:0b78c25514d2f8aa772b5556da890bc177862bf27a36ed7fa20e56498b652e5a - Production: https://reqsai.tech
Changes
Added (Share a session — feature/137-session-share-link, #137)
- Share links can follow one discovery session, as a spectator (
VIEW: read only) or as a reviewer (REVIEW: also accepts or dismisses suggestions and approves or rejects the session's stories).POST /api/projects/{id}/share-linkstakessessionIdandaccess; creating a reviewer link needsSESSION_DECIDE, a spectator linkSESSION_READ. The session must belong to the project. MigrationV20261012113000addssession_idandaccesstopublic.share_links; existing links stay backlog links withREVIEWaccess. - Public
GET /api/share/session/{token}: the session's state, the latest 200 final transcript segments, speakers, pending suggestions and the stories it produced (merged ones hidden), meant to be polled while the session is live.POST .../suggestions/{id}/accept|dismissandPOST .../stories/{id}/statusdecide with a reviewer link; a spectator link gets403 SHARE_LINK_READ_ONLY, and a story outside the session reads as not found. - A backlog link no longer opens a session endpoint and a session link no longer opens the backlog; both answer
SHARE_LINK_UNAVAILABLE. ShareLinkResponsecarriessessionIdandaccess.
v1.4.0-rc.1
Release candidate 1.4.0-rc.1 of Kntro-Soft/reqsai-api (version 1.4.0, build 3).
| Commit | ff95f858608d9f41677bd5fdb4280ed9795ccfe2 on release/1.4.0 |
| Tree | f0bd875942c1052fd9c38f3a18b4bdb0be6f7445 |
| Built by | https://github.com/Kntro-Soft/reqsai-api/actions/runs/38274093661 |
| Image | ghcr.io/kntro-soft/reqsai-api@sha256:0b78c25514d2f8aa772b5556da890bc177862bf27a36ed7fa20e56498b652e5a |
| Stage | verified · https://github.com/Kntro-Soft/reqsai-api/actions/runs/38274093661 |
Production ships this candidate only from a main commit whose tree is f0bd875942c1052fd9c38f3a18b4bdb0be6f7445, without rebuilding.
v1.3.0
Promoted to production from candidate 1.3.0-rc.1 without rebuilding.
- Released commit:
243cfae93d45bbb454895f7841c5ed31e292fc3a(tree3a47f4b109e4ed84a2f5415d83ae372d0f37b2a9) - Candidate commit:
fded2750f1277083b3b566ffae33ec79648803deonrelease/1.3.0 - Image:
ghcr.io/kntro-soft/reqsai-api@sha256:b1411b7cf07c01a7abfc2b79565a67d3bd193aaf09efeec4c41e994b5ea69d5c - Production: https://reqsai.tech
Changes
Added
- Accepting a suggestion decides the story's review status in the same transaction.
POST /api/projects/{projectId}/suggestions/{id}/acceptandPOST /api/sessions/{sessionId}/suggestions/{id}/accepttake an optionalapproveflag (defaultfalse, so older clients keep working).approve: truecreates (NEW_STORY) or updates (UPDATE_STORY,EDGE_CASE) the story and leaves itAPPROVED; it needsSTORY_APPROVEon top ofSESSION_DECIDE, otherwise 403 and nothing changes. Without it the story is saved as a draft. - Status rules: a new story starts
DRAFTorAPPROVED. A target story that wasAPPROVEDorREJECTEDgoes back toDRAFTwhen saved as a draft (its content changed and needs a new review) and becomesAPPROVEDwhen approved. A target alreadyEXPORTEDorMERGEDkeeps its status either way.CLARIFYING_QUESTIONignores the flag. - The accepted suggestion (REST responses, the project suggestion list, the session suggestion list, the assistant chat history) and the realtime
SUGGESTION_ACCEPTEDmessage carryresolvedStoryStatus, so the decision row can say whether the story ended approved or as a draft. No migration: the status is read from the story.
Added (Token metering — feature/130-token-metering)
-
Usage ledger. Every successful AI call is one idempotent row of the tenant table
ai_usage_events(feature, project, model, input / output / cached input tokens, the quota tokens it added, audio seconds), written off the request thread so a metering problem never fails the AI call. Features: live suggestions, chat, final stories, code index, code deep search, document classification, embeddings and transcription. Tenant migrationV20261012100000__ai_usage_events.sql.TokenUsageRecorderPortgainsrecord(TokenUsage);record(long)still works. -
Embeddings and speech-to-text are metered. Embeddings report the tokens the provider counted (an estimate of one per four characters when it returns none) and count at a tenth in the quota. Streaming and uploaded audio are metered in seconds (
audio_seconds) and never count as tokens. -
Atomic quota counter.
token_quota_usedis raised with oneUPDATE ... SET token_quota_used = token_quota_used + nin the transaction of the ledger insert, so parallel calls no longer lose increments; the period rollover is kept. A cached input token counts at half (the provider bills it at half), seedocs/BILLING.md. Common migrationV20261012100100__subscription_quota_warning.sql. -
The monthly allowance is enforced. The chat, "Analizar ahora", live suggestions, code indexing and document classification check it first. At the cap an explicit AI request fails with
AI_QUOTA_EXCEEDED(HTTP 402, withplan,limit,usedandresetsAt); live suggestions pause quietly and the session gets oneAI_QUOTA_PAUSEDmessage; code indexing keeps the structural description of the modules; an uploaded document is stored unclassified. Reading, editing and exporting never stop. The check fails open. -
Warnings at 80, 90 and 100 %.
GET /api/subscriptions/organization/{id}/usagereturnswarningLevel, and aTOKEN_QUOTA_WARNINGmessage goes to/topic/organizations/{id}/usageonce per level per period. -
Usage read model. The usage response adds the period's tokens by feature and by project, the transcription seconds and a
meetingEstimate(minutes left at the organization's own measured tokens per meeting minute, or a documented default of 10,000). -
reqsai.ai.generation.live-model(GENERATION_LIVE_MODEL) sets a cheaper model for live passes only; unset keeps the provider's default. -
Deep search of the pure source code (
codebase:DeepCodeSearchPort). It fetches the repository archive at the indexed commit through the indexer's access (installation token, or anonymous for a public repository) into a temporary file kept 10 minutes (ArchiveCache: at most 4 files and 400 MB, always deleted), removes secrets, and ranks windows of code with a BM25-like lexical search (CodeSearcher) that matches Spanish requests with English identifiers by word root. It returns at most 10 snippets and 12000 characters with file, lines and a GitHub link. Nothing is persisted. Seedocs/CODE_COPILOT.md. -
Verify a suggestion in the code.
POST /api/projects/{projectId}/suggestions/{suggestionId}/verify-code(SESSION_DECIDEandINTEGRATION_READ; 202, or 409 when no repository is ready) searches the code and has the model read the passages once (at most one model call and 25 seconds). The suggestion gets a verdict (ALREADY_EXISTS,CONFLICTS_WITH_CODE,NOT_FOUND,UNSURE), a note, references with file and lines,verifiedAt, or averifyErrorto retry. The card is updated live bySUGGESTION_CODE_UPDATED(session topic, and/topic/projects/{projectId}/suggestions). MigrationsV20261012110000andV20261012110100. -
CodeReferenceand its response gain optionalfile,lineStart,lineEndandquote;urlpoints at…/blob/<commitSha>/<file>#L<a>-L<b>. Older references still read as module references.codein a suggestion gainsverdict,verifyState,verifiedAtandverifyError. -
Assistant chat searches the code when the model says the question is about the code and the index does not answer it: the reply says it searched the source code and cites file and lines (
codeSearched,codeReferencesin the message). Latency of other messages is unchanged; it falls back to the model's own reply when the search cannot run. -
Create a project with Jira and GitHub (#132).
POST /api/organizations/{orgId}/projectsaccepts optionalsources:{jira?: {connectionId?, projectKey, issueTypeName, importStories}, github?: [{repository, branch?, installationId?}]}. The project is created and answers at once; the sources are set up in the background.- What can be checked at once is checked before the project exists, with a 4xx: the Jira connection exists, each repository is readable (shared by an installation, or public), the per-project repository limit, no repeated repository.
workspaceannounces the request with the public eventProjectSetupRequestedIntegrationEventonworkspace::api(after commit, in the background, bound to the tenant).gatewaysaves the Jira target and starts the import;codebaseconnects and indexes the repositories. Both use the same handlers as the REST endpoints, on behalf of the creator.workspacedepends on neither: they implementProjectSetupParticipantand report throughProjectSetupReporter.- A source that fails never fails or undoes the project: the failure is recorded in the new tenant table
project_setup_steps(migrationV20261012120000) and logged. GET /api/projects/{projectId}/setup(INTEGRATION_READ) returns the steps (JIRA_LINK,JIRA_IMPORT,GITHUB_REPOS) with state and counts, merged from the repositories' indexing, the Jira target and import job and the recorded state, plus the stack detected in the indexed repositories. The same object is pushed on/topic/projects/{projectId}/setup.POST …/setup/steps/{step}/skipand…/retry(INTEGRATION_WRITE) leave a step out or run a failed one again.GET /api/organizations/{orgId}/code/github/repositorieslists what the organization's GitHub installations share, so a project that does not exist yet can pick repositories.
-
New
overviewmodule: read-only dashboards of a project and of an organization (#129).GET /api/projects/{projectId}/overview: stories by status and priority, story points,
coverage (acceptance criteria, origin quote, linked code), sessions and stories per week over the
last 12 weeks, how often the copilot's proposals were accepted or dismissed, glossary, constraints,
documents and assigned members, and the connected code. Each section follows the permission that
guards the same data (STORY_READ,SESSION_READ,GLOSSARY_READ,CONSTRAINT_READ,
DOCUMENT_READ,MEMBER_READ,INTEGRATION_READ) and isnullwithout it;403when the caller
holds none,404for an unknown project.GET /api/organizations/{organizationId}/overview(any member): the same figures across the
projects the caller may see, the busiest projects and, for owners and admins only, the headcount.
Answers403for an organization other than the one the token is bound to.- Everything is counted in SQL (
COUNT/GROUP BY/FILTER); no entity is loaded. Each context owns its
figures behind a new named interface:discovery::insights,workspace::insightsand
CodebaseModuleApi.footprint. No migration.
Changed
- Final stories (processing a session or an uploaded recording) now get the same context as live suggestions: backlog candidates, glossary, constraints and the related modules of the connected code. Without context, or if the lookup fails, they are generated from the transcript alone as before.
- The release pull request and the back-merge pull request are opened by the GitHub App
reqsai-release-bot(a short-lived token minted per job fromRELEASE_APP_IDandRELEASE_APP_PRIVATE_KEY), so their CI runs: opened withGITHUB_TOKENthey started nopull_requestworkflow. The back-merge turns on auto-merge (merge commit) when the repository allows it; without the App configuration the job fails instead of falling back toGITHUB_TOKEN. produccion.ymlandrollback.ymldispatchreqsai-infra'sdeploy-mvp.ymlwith areqsai-release-bottoken lim...
v1.3.0-rc.1
Release candidate 1.3.0-rc.1 of Kntro-Soft/reqsai-api (version 1.3.0, build 2).
| Commit | fded2750f1277083b3b566ffae33ec79648803de on release/1.3.0 |
| Tree | 3a47f4b109e4ed84a2f5415d83ae372d0f37b2a9 |
| Built by | https://github.com/Kntro-Soft/reqsai-api/actions/runs/38207816897 |
| Image | ghcr.io/kntro-soft/reqsai-api@sha256:b1411b7cf07c01a7abfc2b79565a67d3bd193aaf09efeec4c41e994b5ea69d5c |
| Stage | verified · https://github.com/Kntro-Soft/reqsai-api/actions/runs/38207816897 |
Production ships this candidate only from a main commit whose tree is 3a47f4b109e4ed84a2f5415d83ae372d0f37b2a9, without rebuilding.
v1.2.0
Promoted to production from candidate 1.2.0-rc.1 without rebuilding.
- Released commit:
a78624c05064b59d25c15ce317dcc729eb782ee3(treea3fef5f52c5be98e2340354c10026c69bfcb67eb) - Candidate commit:
02da7d578b7201a084909a5f406b2fc05651944conrelease/1.2.0 - Image:
ghcr.io/kntro-soft/reqsai-api@sha256:108520e1ca89f35b387e4757cf56b13c11232df5ffa858156fe5d034c921ef8e - Production: https://reqsai.tech
Changes
Changed (Release pipeline — feature/119-release-pipeline, #119)
- Gitflow release candidates, model C + tag at the end.
release.yml(onrelease/X.Y.Zand
hotfix/X.Y.Z) runs CI, builds thelinux/arm64image once asghcr.io/kntro-soft/reqsai-api:X.Y.Z-rc.N,
records it as the pre-releasevX.Y.Z-rc.N(digest, tree hash, build number), verifies that digest
automatically and opens the PRrelease: X.Y.Z.produccion.yml(onmain) finds the candidate by tree hash,
waits for approval inproduccion, deploys the same digest throughreqsai-infra, labels itX.Y.Z/latest
and only then tagsvX.Y.Zand opens the back-merge PR.rollback.ymlships an earlier release again. - Pushes to
mainno longer deploy by themselves (deploy.ymlremoved); CI and CodeQL also run on pushes to
release/**andhotfix/**. - Deploy switches
ENABLE_REQSAI_API_IMAGEandENABLE_REQSAI_API_DEPLOY(organization variables). - Issue forms for User Story and Task, acceptance criteria on bugs, and
Closes #in the PR template.
Added (Client documents — feature/workspace-client-documents, US22)
- The analyst uploads client documents (PDF or Word
.docx) to a project and ReqsAI turns them into
project context.POST /api/organizations/{orgId}/projects/{projectId}/documents/upload(multipartfile,
DOCUMENT_CREATE) extracts the text (Apache PDFBox 3.0.8 / Apache POI 5.5.1) and asks the AI for
a context summary, glossary terms (term + definition), constraints and the document type. The reply
flags the terms and constraints the project already has (exists).- The document is stored
PENDINGuntil the analyst reviews it.
POST …/documents/{documentId}/apply(DOCUMENT_CREATE, plusGLOSSARY_TERM_WRITE/
CONSTRAINT_WRITEfor what it adds) adds the selected terms and constraints, skipping duplicates
and enforcing the glossary plan limit. It then makes the documentACTIVEwith the reviewed name,
type and summary. DELETE …/documents/{documentId}also discards a pending analysis. Re-uploading the same file
replaces its unapplied analysis, and analyses left for 24 hours are dropped on the next upload.
- The applied summaries feed the AI.
ProjectSnapshot.documentscarries the five newest ones, and
discovery adds them to the project context of realtime suggestions, extraction and the assistant chat. - Uploads are checked before any parsing.
- The extension, the declared content type and the magic bytes must all say PDF or
.docx.
Executables, also renamed ones, and any other format are415 DOCUMENT_TYPE_NOT_ALLOWED. - A file over 50 MB is
413 DOCUMENT_TOO_LARGE. When the multipart limit stops it first, it is
413 PAYLOAD_TOO_LARGE, a new shared code. - An empty file, or a scan without text, is
422 DOCUMENT_EMPTY. A damaged or password-protected
file is422 DOCUMENT_UNREADABLE. - A
.docxis streamed once to cap what it really inflates to (zip bombs), and must declare a
WordprocessingML package, so a renamed Excel or macro-enabled file is refused.
- The extension, the declared content type and the magic bytes must all say PDF or
- Extracted text is capped at 200,000 characters (
truncated), and the model reads the first
60,000. The document text is untrusted: the prompt delimits it in<document>and neutralizes
look-alike tags.- Without an AI model, or when the model fails, the upload still succeeds with
classified: false,
no suggestions and an excerpt as the summary.
- Without an AI model, or when the model fails, the upload still succeeds with
- Storage. Tenant migration
V20261009110000__project_document_uploads.sql:project_documentsgains file name, media type, size, extracted characters, summary and a
content_id;- the text lives in the new
project_document_contents, loaded only on demand. - Pending documents are left out of listings, global search and the AI context.
- Every new organization gets a demo project with static Spanish sample data and no AI call:
"Demo · Restaurante La Tradición — Reservas en línea".- Workspace part: profile (domain, platforms, stack), 5 glossary terms and 3 constraints.
- Discovery part: a
COMPLETEDsession with a 12-segment diarized transcript, 6 stories (3APPROVED,
3DRAFT) with Given/When/Then criteria, and 2PENDINGsuggestions (a new story and a clarifying
question). - Stories are left without an embedding; the lazy re-index pass indexes them on the first live
session.
- Seeding is synchronous, right after the organization commits.
DemoProjectProvisioningListenerlistens toOrganizationCreatedEvent(@TransactionalEventListener,
after commit) and binds the new tenant. ThePOST /api/organizationsresponse already includes the
demo.- Best-effort: a seeding failure is logged and never fails the organization creation.
- Idempotent: one demo per organization, also enforced by the partial unique index
uq_projects_org_demo.
- Discovery seeds its own part through the new
workspace::apiintegration event
DemoProjectSeededIntegrationEvent.- A synchronous
@EventListenerin the same transaction, so the whole (re)seed is atomic. - Workspace never reaches into Discovery.
- A synchronous
POST /api/organizations/{orgId}/projects/{projectId}/demo/restore(PROJECT_UPDATE; owners and
admins bypass) restores the original sample data and returns200with the project.- Wipes the project's sessions, segments, stories, criteria, client feedback, suggestions and
assistant chat, then seeds them again. Share links are kept. - Resets the profile, glossary and constraints. The name is kept.
409 PROJECT_NOT_DEMOon any other project;409 SESSION_ALREADY_ACTIVEwhile a session records.
- Wipes the project's sessions, segments, stories, criteria, client feedback, suggestions and
- The demo does not count against the plan's project limit.
projects.demo(tenant migrationV20261009120000__project_demo_flag.sql).ProjectResponse.demo(appended).PROJECT_PLAN_LIMIT_EXCEEDEDcounts only non-demo active projects.
- Existing organizations are not back-filled; only organizations created from now on get the demo.
- Tests:
DemoProjectTemplateTest,DemoDiscoveryContentTest: the sample aggregates are valid;- seeder and handler unit tests;
DemoProjectIntegrationTest: seeding, plan limit, modify then restore,PROJECT_NOT_DEMO,403for
a READ member.
Added (US40 — Identify the speakers of a meeting — feature/discovery-speaker-labels)
- The diarized speakers of a session can be listed and described.
GET /api/projects/{projectId}/sessions/{sessionId}/speakers(SESSION_READ) lists them by first
appearance in the transcript:label,index,displayName,name("Hablante N" until named),
sideandsegmentCount.PUT /api/projects/{projectId}/sessions/{sessionId}/speakers/{label}(SESSION_RUN) takes
{displayName, side};sideisCLIENTorTEAM. A blank name goes back to "Hablante N". The
description applies to every segment of that speaker, past and future.- A label that never spoke in the session answers 404
SPEAKER_NOT_FOUND. - Tenant migration
V20261009100000__session_speakers.sqladdssession_speakers, unique per
(session_id, speaker_label). - Each change is pushed live on the session topic as
SPEAKER_UPDATED.
- Overlapping speech is reported. The same response carries
overlaps(count,totalMs, up to 50
ranges): stretches where two different speakers' segments overlap for at least 500 ms, where the
speaker attribution may be wrong. Shorter overlaps (a quick "ajá") are ignored. - The AI puts the client first.
- When the transcript is diarized, it reaches the model as one line per speaker turn:
[Ana (Cliente)]: …,[Hablante 2 (Equipo)]: …. - Both prompts gain a rule: what the client asks for, rules or decides is the requirement. What the
team says is context, and only becomes a story when the client confirms it. When they disagree,
the model follows the client. - Applies to the realtime suggestion passes, the flush on stop, and processing an uploaded
recording. Cadence and backlog retrieval still use the plain text. - Names are analyst input: brackets and line breaks are neutralized so they cannot forge a tag, and
the transcript delimiters are neutralized as before.
- When the transcript is diarized, it reaches the model as one line per speaker turn:
- Uploaded recordings keep their speakers.
- Deepgram batch now requests
utterances=true. Withdiarizealone it labelled the words but
returned no utterances, so the speakers were lost. - The diarized utterances of an upload are stored as final segments. The session then shows its
speakers like a live one. Uploads without speaker labels (Whisper) keep only the text, as before.
- Deepgram batch now requests
- Live Deepgram results are split by speaker. A final result whose words change speaker becomes one
segment per speaker turn, with each turn's own timing. Before, the whole result went to the first
word's speaker. - Tests:
- domain:
SessionSpeakerTest,SpeakerRosterTest,SpeakerOverlapDetectorTest; - application:
SpeakerTranscriptFormatterTest,UpdateSessionSpeakerCommandHandlerTest, and the
speaker cases of the realtime, processing and upload tests; - prompts and parsing:
GenerationScenarioTestandDeepgramStreamingAdapterTest; SessionSpeakersIntegrationTest: upload a diarized meeting, list, name, refuse and process, over
HTTP and the tenant schema.
- domain:
Added (US50 — Share stories with the client — feature/discovery-share-with-client)
- Share links. The team opens a link a client uses without an acc...
v1.2.0-rc.1
Release candidate 1.2.0-rc.1 of Kntro-Soft/reqsai-api (version 1.2.0, build 1).
| Commit | 02da7d578b7201a084909a5f406b2fc05651944c on release/1.2.0 |
| Tree | a3fef5f52c5be98e2340354c10026c69bfcb67eb |
| Built by | https://github.com/Kntro-Soft/reqsai-api/actions/runs/38063688058 |
| Image | ghcr.io/kntro-soft/reqsai-api@sha256:108520e1ca89f35b387e4757cf56b13c11232df5ffa858156fe5d034c921ef8e |
| Stage | verified · https://github.com/Kntro-Soft/reqsai-api/actions/runs/38063688058 |
Production ships this candidate only from a main commit whose tree is a3fef5f52c5be98e2340354c10026c69bfcb67eb, without rebuilding.