TypeSafe and Jev in Laravel: Lessons from Evaluating 4,344 GitHub Projects

Case study · Laravel · TypeSafe · Jev · AI filtering

We connected Jev to our GitHub project analyzer and evaluated 4,344 repositories in a single batch. The median request time was 611 ms, with no processing errors. But a fast, structured response does not guarantee sound selection: Jev accepted developers’ profile READMEs and would have more than doubled the number of candidates sent for deeper analysis.

TypeSafe and Jev: structured AI decisions and data type validation
4,344projects evaluated
611 msmedian request time
0processing errors
59.8%agreement with Ollama routing

Jev proved to be a fast candidate for preliminary filtering. Before replacing the existing model, however, we need to align the selection rules, check borderline cases, and estimate the workload passed to the next stage.

This follows our article “Running a Local LLM in Production: Integrating Ollama with Laravel”. That experiment examined a local model running on a CPU and its integration with DeepSeek. This time, we tested what happens when a specialized cloud API makes the initial decision about a project.

The task we gave Jev

In IdeaRadar, projects go through several stages: collection from GitHub, checks in PHP, an initial assessment through Ollama, and detailed analysis through DeepSeek. The early stage needs to answer one question: does this repository contain an independent product idea worth exploring?

For this experiment, Jev ran separately over the accumulated database. It saved its own assessment without controlling which projects went to DeepSeek. This let us compare results while keeping the existing routing in place.

  1. Prepare the input

    The name, description, README, repository metadata, and available homepage information.

  2. Get a short decision

    Jev chooses between “not worth considering” and “worth considering.”

  3. Save the result

    The decision, probabilities, model version, input hash, request duration, and token usage.

  4. Compare with Ollama

    Check which projects each approach would send to the next stage.

TypeSafe: decisions with a defined response type

The TypeSafe HTTP API accepts input data as state and a set of questions. Our task suited Choice: selecting from predefined options. The response includes the selected option, a probability distribution, and confidence.

We called POST https://api.typesafe.ai/v1/systemone with the model set to jev-latest. Every saved response in this run reported the actual version as jev-1.13.0. This ties the experiment to a specific model, even if the alias later points to another version.

Two model answers

ignore means obvious noise, a learning exercise, a template, or no independent product idea. consider means a potentially useful project, including uncertain cases that need closer examination.

Three application states

0 — processing error.
1 — not worth considering.
2 — worth considering.

The code assigns zero when a request fails or the response is invalid. It is not a third product assessment option.

Running the evaluation from Laravel

We added a separate service using Laravel’s built-in HTTP client and an Artisan command for the batch run. The same input builder used by the short Ollama gate prepared the data. The API received information about each project, without other models’ verdicts.

The command fixed the upper project ID for the batch and saved each result immediately. Subsequent runs skipped processed records, with a separate option to retry errors. Temporary API failures triggered a limited number of retries with increasing delays. Authentication problems or a series of failures stopped the batch.

php artisan idearadar:jev-evaluate --max-id=111618
php artisan idearadar:jev-evaluate --report --max-id=111618

The projects table gained a line such as Jev - 1 or Jev - 2. We also stored the detailed response: a single number is not enough to investigate classification errors later.

4,344 requests: speed and results

The run took place on September 21, 2026, from 18:42:39 to 19:29:33 UTC — approximately 47 minutes. Requests were processed sequentially.

All projects included in the experiment
Result Projects Share
0 — error 0 0%
1 — not worth considering 1,665 38.3%
2 — worth considering 2,679 61.7%

The median request time was 611 ms, the 95th percentile was 734 ms, and the mean was approximately 640 ms. Total usage reported by the API was 4,764,842 input tokens and 139,008 output tokens. We are not claiming financial savings from these figures: that requires accounting for the API price and the cost of subsequent analysis.

The saved short Ollama requests had a median duration of approximately 25 seconds. These are operational measurements taken at different times, not a simultaneous benchmark under identical load. Nor can they be compared directly with the longer, full analysis in the previous article: this task is much narrower.

The first mistake was in our selection query

For the batch, we selected projects with screening_decision=accept. During the audit, we found that this status did not mean they had passed the PHP pre-filter: the 4,344 records included 875 with a reject decision and 20 with no result from that filter.

The appropriate pass/review group for the next stage contained 3,449 projects. Jev rejected 1,299 and accepted 2,150. Both AI assessments were available for 3,448 projects; these form the comparison below.

Before evaluating a model, check which records actually entered the experiment. Otherwise, the metrics describe a different sample from the one you intended to study.

Why agreement with Ollama was 59.8%

3,448 projects with both assessments; Ollama is evaluated using the rule for routing to DeepSeek
Jev decision Ollama does not advance Ollama advances
Not worth considering 1,204 95
Worth considering 1,291 858

The two approaches agreed in 2,062 cases and disagreed in 1,386. 59.8% is the agreement rate, not Jev’s accuracy. Ollama’s answer is not a ground-truth label.

Of the 1,291 cases where Jev accepted a project but Ollama did not advance it, 1,053 had an Ollama decision of MAYBE with confidence below 75. The code does not send those projects onward. Jev’s instructions, meanwhile, explicitly told it to choose consider when uncertain. Different policies for handling uncertainty explain much of the disagreement.

The saved input hashes matched in 3,437 of the 3,448 pairs. The remaining 11 pairs cannot be treated as comparisons on identical input.

The audit also uncovered a UI inconsistency: the table displayed every MAYBE as a positive Ollama result, even though the actual routing applied a threshold. Our report used the rule in the code, rather than the number shown on screen.

Where Jev helped and where it went wrong

Additional candidates

secure-exam-cloud describes exam material management, Acceptance-pdf-automation handles document automation, and san650/today is a local daily task list.

Jev gave them a 2. Their saved descriptions provide reasonable grounds for further evaluation, although implementation quality still needs to be assessed.

Reasonable rejections

The educational data-pulse-dashboard, which uses demonstration data, and the personal website nikhilappari/Portfolio received a 1. Ollama had advanced them under its current threshold.

For a filter seeking independent products, these rejections look justified.

The clearest errors appeared in FroggyAwesome/FroggyAwesome and jishan2001/jishan2001. Both are developer profile READMEs, yet both received a 2. Their consider probabilities were 91% and 78%, respectively.

A likely explanation is that the model attributed the value of projects mentioned in the README to the profile repository itself. A reference to a custom operating system, for example, deserves a separate investigation, but does not turn an “about me” page into a software product.

The sample contained 71 repositories whose names matched their owners’ names; Jev accepted 37. This is a reason to review potential profiles, not proof of 37 errors: matching names alone are insufficient for a final decision.

Model confidence does not replace a semantic check

Across the full run, 516 responses had confidence below 0.3. The current implementation still saved the chosen option as 1 or 2. The same number on screen could therefore represent either a confident decision or nearly equal probabilities.

According to the TypeSafe documentation, confidence is calculated from the probability distribution. It helps distinguish a clear answer from an uncertain one, but does not prove that the classification is correct. The profile that received a 91% consider probability illustrates the limits of relying on a threshold alone.

Two separate changes are needed: define the subject of the assessment more precisely in the question, and decide how to handle uncertainty. For profiles, an ordinary code-based check before calling AI is also useful.

A fast filter can increase costs further down the pipeline

On the shared sample of 3,448 projects, the Ollama approach advances 953 candidates, while Jev advances 2,149. Simply replacing one filter with the other would increase the flow to DeepSeek by a factor of 2.25.

This is a projection based on saved decisions. The experiment did not automatically launch those additional DeepSeek requests. More candidates may mean fewer missed ideas, but also more noise and expense. Choosing the right balance requires labeled examples.

What to check before enabling it in the main pipeline

  1. Fix the sample and the rules

    Select the intended PHP filter results and apply the same interpretation of uncertainty to both models.

  2. Evaluate the current repository

    Explicitly distinguish its own product from other projects merely mentioned in the README.

  3. Create a manually labeled sample

    Review 100–200 examples: useful products, profiles, learning exercises, templates, and borderline cases.

  4. Measure the whole pipeline

    Track missed ideas, unnecessary admissions, and DeepSeek costs alongside the speed of the initial request.

At the time of this experiment, Jev remains a separate assessment used for comparison. Its speed suits large-scale preliminary screening, and the error analysis produced a concrete list of improvements. These results do not yet justify automatically replacing Ollama.

Need AI analysis built around your data?

I develop AI pipelines with data preparation, queues, response validation, and quality checks. Model selection is one part of the work; dependable results also rely on the rules connecting each stage.

AI agent and RAG system development →

Previous article: running a local LLM with Ollama and Laravel.

Laravel · TypeSafe · Jev · Ollama · DeepSeek · GitHub · Structured Output