Commits

Actions from a Job Posting and a Supported AI Chain

Job posting details extract data and generate a résumé and cover letter, and each person chooses where the AI model comes from: a subscription, their own provider, or the platform, with automatic fallback if the first option fails.

70e8236 · job-finder · milestone

Today’s work centers on one idea: that AI should stop being a single path and instead serve each individual. It is also about making actions available where you are, right in front of a job posting.

From a job posting, three actions

Tickets #15 and #16 were the same: the API already extracted information and generated documents, but there was no screen to request it. Now, the details of a job posting offer three actions: extract with AI, generate a résumé, and generate a cover letter. The extraction is saved to the posting and only fills in what was missing: information already provided by the source is preserved, and anything the AI cannot find is marked as unavailable. The draft appears in Documents, with a direct link from the posting, and can be edited before it is used. When the provider fails, the screen explains the reason with its own message without inventing data: during live testing, the ChatGPT plan was still exhausted, and the interface explained this without sugarcoating it.

A supported AI chain

Until now, if the ChatGPT subscription failed—for example, because the plan’s quota was exhausted—the operation was left without AI even when the platform had configured providers. The resolution was a single path, but now it is a chain: personal subscription, default API provider, and secondary provider. Each step can fail in two ways—it cannot be configured or generation fails—and both failures pass control to the next step. An error is only reported when no support remains, including the reason for each attempt. The environment’s inherited configuration continues to be the path when there is no saved selection, but it does not enter the chain. During live verification, with the subscription exhausted, the extraction of a job posting worked: the chain fell back to the platform provider, and the data was saved.

Own credentials: a complete provider

In My Services, the AI credential already requests a type, address, and key, just like the platform providers: job seekers can bring their own OpenRouter, Gemini, or Anthropic key and choose the model by function, with the model list loaded using their address and key. The chain gains its own step, immediately after the subscription and before the platform providers. The address is validated in the same way as the platform addresses—HTTPS and a public domain—and errors when retrieving the model list are explained without exposing the key.

Everyone chooses where the model comes from

Until now, the ChatGPT subscription always took priority whenever it was connected: anyone who ran out of plan credits had no way to say “use my API key,” even if they had configured one. My Services now includes “Model origin by function”: for documents and extraction, the origin can be chosen—the subscription, the user’s own provider, or the platform providers—and the selection goes first in the chain, while the others remain available as fallbacks in case it fails. If the provider does not publish the list, the model can also be entered manually.

Administration and wrap-up

There was also time for housekeeping: each history search can be deleted along with its job postings and with prior confirmation, and it only affects records belonging to the person making the request. The email configuration includes a send test that explains the reason for the server error, which is the only way to determine whether the problem is the password, the port, or the server. The superadministrator can now exercise all three roles with their own account, allowing them to support candidates and test the full recruiter flow: during testing, the relationships created to verify it were deleted afterward.

The day wraps up with the specification, decision map, journal, and tickets up to date, and the previous session’s inventory in green: 219 API tests and 93 web tests, with clean type checking. One remaining task is to view live ranking verdicts with a model, because the ChatGPT plan has not yet allowed this.