Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

feat/cody: Refactor completions API to use new modelconfig (support more models)#63797

Merged
chrsmith merged 6 commits into
mainfrom
chrsmith/use-modelconfig
Jul 12, 2024
Merged

feat/cody: Refactor completions API to use new modelconfig (support more models)#63797
chrsmith merged 6 commits into
mainfrom
chrsmith/use-modelconfig

Conversation

@chrsmith

@chrsmith chrsmith commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This PR if what the past dozen or so cleanup, refactoring, and test PRs were all about: using the new modelconfig system for the completion APIs.

This will enable users to:

  • Use the new site config schema for specifying LLM configuration, added in https://github.com/sourcegraph/sourcegraph/pull/63654. Sourcegraph admins who use these new site config options will be able to support many more LLM models and providers than is possible using the older "completions" site config.
  • For Cody Enterprise users, we no longer ignore the CodyCompletionRequest.Model field. And now support users specifying any LLM model (provided it is "supported" by the Sourcegraph instance).

Beyond those two things, everything should continue to work like before. With any existing "completions" configuration data being converted into the modelconfig system (see https://github.com/sourcegraph/sourcegraph/pull/63533).

Overview

In order to understand how this all fits together, I'd suggest reviewing this PR commit-by-commit.

Update internal/completions to use modelconfig

The first change was to update the code we use to serve LLM completions. (Various implementations of the types.CompletionsProvider interface.)

The key changes here were as follows:

  1. Update the CompletionRequest type to include the ModelConfigInfo field (to make the new Provider and Model-specific configuration data available.)
  2. Rename the CompletionRequest.Model field to CompletionRequest.RequestedModel. (But with a JSON annotation to maintain compatibility with existing callers.) This is to catch any bugs related to using the field directly, since that is now almost guaranteed to be a mistake. (See below.)

With these changes, all of the CompletionProviders were updated to reflect these changes.

  • Any situation where we used the CompletionRequest.Parameters.RequestedModel should now refer to CompletionRequest.ModelConfigInfo.Model.ModelName. The "model name" being the thing that should be passed to the API provider, e.g. gpt-3.5-turbo.
  • In some situations (azureopenai) we needed to rely on the Model ID as a more human-friendly identifier. This isn't 100% accurate, but will match the behavior we have today. A long doc comment calls out the details of what is wrong with that.
  • In other situations (awsbedrock, azureopenai) we read the new modelconfig data to configure the API provider (e.g. Azure.UseDeprecatedAPI), or surface model-specific metadata (e.g. AWS Provisioned Throughput ARNs). While the code is a little clunky to avoid larger refactoring, this is the heart and soul of how we will be writing new completion providers in the future. That is, taking specific configuration bags with whatever data that is required.

Fix bugs in modelconfig

While we had lots of tests for converting the existing "completions" site config data into the modelconfig.ModelConfiguration structure, there were a couple of subtle bugs that I found while testing the larger change.

The updated unit tests and comments should make that clear.

Update frontend/internal/httpapi/completions to use modelconfig

The final step was to update the HTTP endpoints that serve the completion requests. There weren't any logic changes here, just refactoring how we lookup the required data. (e.g. converting the user's requested model into an actual model found in the site configuration.)

We support Cody clients sending either "legacy mrefs" of the form provider/model like before, or the newer mref provider::apiversion::model. Although it will likely be a while before Cody clients are updated to only use the newer-style model references.

The existing unit tests for the competitions APIs just worked, which was the plan. But for the few changes that were required I've added comments to explain the situation.

Fix: Support requesting models just by their ID

... We support Cody clients sending either "legacy mrefs" of the form provider/model like before ...

Yeah, so apparently I lied 😅 . After doing more testing, the extension also sends requests where the requested model is just "model". (Without the provider prefix.)

So that now works too. And we just blindly match "gtp-3.5-turbo" to the first mref with the matching model ID, such as "anthropic::unknown::gtp-3.5-turbo".

Test plan

Existing unit tests pass, added a few tests. And manually tested my Sg instance configured to act as both "dotcom" mode and a prototypical Cody Enterprise instance.

Changelog

Update the Cody APIs for chat or code completions to use the "new style" model configuration. This allows for great flexibility in configuring LLM providers and exposing new models, but also allows Cody Enterprise users to select different models for chats.

This will warrant a longer, more detailed changelog entry for the patch release next week. As this unlocks many other exciting features.

@chrsmith chrsmith requested a review from emidoots July 12, 2024 01:10
@cla-bot cla-bot Bot added the cla-signed label Jul 12, 2024
}
})

t.Run("NoCompletionsConfig", func(t *testing.T) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests were removed because we no longer return this error.

The code path was for when Cody was enabled in the site config, but no "completions config" was available. But we now skip looking for the "completions config" directly, and fetch the LLM model configuration data via modelconfig.Get().Get(). (i.e. the model config service, watching for site config updates, etc.)

assert.Contains(t, respBody, `unable to find model "anthropic::api::model"`)
})
assert.Equal(t, http.StatusInternalServerError, status)
assert.Equal(t, "no client known for upstream provider acmeco", respBody)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previously we try to send the unknown model request to Cody Gateway. (Or at least fail when we try to create the Cody Gateway-specific completions provider.)

Now we reject the request much sooner, when we try to resolve the model that the user is requesting. (i.e. "is it found in the site config or not".)

If I get to it, I'll add some more unit tests specifically for the "Cody Enterprise configured to use Cody Gateway" and confirm that that particular path still works as expected. (Similarly, we don't have much automated test coverage for the "Sourcegraph.com x Cody Pro" completion path.)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... thinking about this a little more, this probably isn't a big deal. Since if you want to use Sourcegraph/Cody Gateway for some LLM models, it seems kinda reasonable that we require the provider IDs are exactly "anthropic", "fireworks", etc.

e.g. if a customer wired up a provider named "foo" and somehow that translated to Cody Gateway x OpenAI... that would be confusing, and so that not working might be considered a feature.

@chrsmith chrsmith requested a review from a team July 12, 2024 17:13

@emidoots emidoots left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed everything as carefully as I could, looks good to me.

@chrsmith chrsmith merged commit 02c07df into main Jul 12, 2024
@chrsmith chrsmith deleted the chrsmith/use-modelconfig branch July 12, 2024 19:15
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants