Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,21 @@

## 1.76.0 - tbd

- [ai-anthropic, ai-google, ai-ollama, ai-openai] made the provider language models `@injectable`, transient-scoped services created through a rebindable `<provider>LanguageModelFactory`, so adopters can substitute custom implementations [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-core] ran the tool calls of a model turn concurrently instead of sequentially, including parallel agent delegations, via the new injectable `ToolCallExecutor` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] made the chat-completion tool-call streaming iterator an injectable service, created through the rebindable `ChatCompletionStreamingAsyncIteratorFactory` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [core, filesystem, plugin-ext] fixed file decorations being dropped by large change events: change events are batched, and events exceeding the plugin-ext cap arrive as a flush that is re-fetched on demand [#17766](https://github.com/eclipse-theia/theia/pull/17766) - Contributed on behalf of K2view

<a name="breaking_changes_1.76.0">[Breaking Changes:](#breaking_changes_1.76.0)</a>

- [ai-anthropic, ai-google, ai-ollama, ai-openai] the provider language models (`AnthropicModel`, `GoogleModel`, `OllamaModel`, `OpenAiModel`) no longer have public constructors; they are `@injectable` and receive their configuration from an injected `<provider>ModelParams`. Instantiate them via the corresponding `<provider>LanguageModelFactory` instead of `new` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-copilot] removed the direct REST transport and its GitHub OAuth App sign-in; all requests are now served by the official GitHub Copilot CLI, which is signed in from within the application and needs to be reachable on the machine hosting the backend. Access to the Copilot models is granted per OAuth application, and the built-in application was never entitled for the current lineup, so the REST path only ever exposed a small legacy subset. Removed as a consequence: the `CopilotOAuthConfig` symbol and its `DEFAULT_COPILOT_OAUTH_CONFIG` value, the `CopilotLanguageModel` class, `getCopilotApiBaseUrl`, `COPILOT_API_BASE_URL`, and the `enableStreaming` and `supportsStructuredOutput` members of `CopilotModelDescription`. `CopilotAuthService.initiateDeviceFlow`, `pollForToken`, `getAccessToken` and `signOut` are replaced by `startSignIn`, `waitForSignIn` and `cancelSignIn`, since the CLI performs and polls the flow itself and owns the resulting token, and `setExecutablePath` has been added so that the frontend can hand the configured location of the CLI to the backend. Users have to sign in again: the sign-in of the previous version belongs to an OAuth app that is no longer used, so it is removed from the credential store on first start and a notification asks for a new sign-in. Adopters that rebound `CopilotOAuthConfig` to their own OAuth App no longer need to, and adopters relying on the REST transport should note that structured output is not available on the CLI path. See the migration guide [#17919](https://github.com/eclipse-theia/theia/pull/17919)
- [ai-ollama] renamed the exported `OllamaModelFactory` symbol/type to `OllamaLanguageModelFactory` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] `OpenAiLanguageModelsManagerImpl` no longer injects `OpenAiModelUtils` or `OpenAiResponseApiUtils`; the `openAiModelUtils` and `responseApiUtils` fields were removed [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] `OpenAiModel.createTools()` now returns `ChatCompletionTool[]` instead of `RunnableToolFunctionWithoutParse[]`, and `runnerOptions.maxChatCompletions` bounds only the Response API path, because the OpenAI SDK `runTools` runner is no longer used [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] moved `OpenAiModelUtils` out of `openai-language-model.ts` into a new `openai-model-utils.ts` module; deep imports of the old path break [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] removed the `toolCallExecutor` field from `OpenAiModel` and the `toolCallExecutor` property of `ChatCompletionToolLoopOptions`; `ChatCompletionStreamingAsyncIterator` injects `ToolCallExecutor` itself [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] renamed the exported `OpenAiModelFactory` symbol/type to `OpenAiLanguageModelFactory` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [core] widened `DecorationsProvider.onDidChange` to `Event<URI[] | undefined>`, where `undefined` is a flush signalling that all decorations may have changed. `DecorationsService.onDidChangeDecorations` now fires batched payloads that never list removals: an empty map means an unspecified set changed, and clients must re-query the decorations they display on every event [#17766](https://github.com/eclipse-theia/theia/pull/17766)

## 1.75.0 - 8/27/2026
Expand Down
12 changes: 11 additions & 1 deletion packages/ai-anthropic/src/node/anthropic-backend-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,27 @@
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************

import { ContainerModule } from '@theia/core/shared/inversify';
import { Container, ContainerModule } from '@theia/core/shared/inversify';
import { ANTHROPIC_LANGUAGE_MODELS_MANAGER_PATH, AnthropicLanguageModelsManager } from '../common/anthropic-language-models-manager';
import { ConnectionHandler, PreferenceContribution, RpcConnectionHandler } from '@theia/core';
import { AnthropicLanguageModelsManagerImpl } from './anthropic-language-models-manager-impl';
import { AnthropicLanguageModelFactory, AnthropicModel, AnthropicModelParams } from './anthropic-language-model';
import { ConnectionContainerModule } from '@theia/core/lib/node/messaging/connection-container-module';
import { AnthropicPreferencesSchema } from '../common/anthropic-preferences';

// We use a connection module to handle AI services separately for each frontend.
const anthropicConnectionModule = ConnectionContainerModule.create(({ bind, bindBackendService, bindFrontendService }) => {
bind(AnthropicLanguageModelsManagerImpl).toSelf().inSingletonScope();
bind(AnthropicLanguageModelsManager).toService(AnthropicLanguageModelsManagerImpl);
bind(AnthropicModel).toSelf().inTransientScope();
bind(AnthropicLanguageModelFactory).toFactory<AnthropicModel, [AnthropicModelParams]>(
Comment thread
cdamus marked this conversation as resolved.
({ container }) => params => {
const child = new Container();
child.parent = container;
child.bind(AnthropicModelParams).toConstantValue(params);
return child.get(AnthropicModel);
}
);
bind(ConnectionHandler).toDynamicValue(ctx =>
new RpcConnectionHandler(ANTHROPIC_LANGUAGE_MODELS_MANAGER_PATH, () => ctx.container.get(AnthropicLanguageModelsManager))
).inSingletonScope();
Expand Down
Loading
Loading