Skip to content
Open
Show file tree
Hide file tree
Changes from 13 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
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@

- [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/)

## 1.76.0 - tbd

- [ai-anthropic, ai-google, ai-ollama, ai-openai, ai-copilot] added rebindable `<provider>LanguageModelFactory` bindings for instantiating provider language models [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-core] executed a model turn's tool calls concurrently, including parallel agent delegations, instead of sequentially, via a new injectable `ToolCallExecutor` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-anthropic, ai-google, ai-ollama, ai-openai, ai-copilot] the provider language model classes are now `@injectable`, transient-scoped services constructed via their `<provider>LanguageModelFactory`, so adopters can rebind them to substitute custom implementations [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai] added a rebindable `ChatCompletionStreamingAsyncIteratorFactory`; the chat-completion tool-call streaming iterator (used by the OpenAI and Copilot models) is now an injectable service that can be substituted [#17623](https://github.com/eclipse-theia/theia/pull/17623)

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

- [ai-openai] `OpenAiLanguageModelsManagerImpl` no longer injects `OpenAiModelUtils` or `OpenAiResponseApiUtils` (the `openAiModelUtils` and `responseApiUtils` protected fields were removed); provider models are now constructed via the injected `OpenAiLanguageModelFactory` [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-openai, ai-copilot] `OpenAiModel.createTools()` and `CopilotLanguageModel.createTools()` now return `ChatCompletionTool[]` instead of `RunnableToolFunctionWithoutParse[]`, because the OpenAI SDK `runTools` runner is no longer used [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-copilot] removed the `protected runnerOptions` field from `CopilotLanguageModel`; its only purpose was the `maxChatCompletions` turn cap, which is gone now that the OpenAI SDK `runTools` runner is unused, so the tool loop runs until the model stops requesting tools. Subclasses that read or overrode `runnerOptions` must adapt. `OpenAiModel.runnerOptions` is retained, but its `maxChatCompletions` now bounds only the Response API path, not the Chat Completions tool loop [#17623](https://github.com/eclipse-theia/theia/pull/17623)
- [ai-anthropic, ai-google, ai-ollama, ai-openai, ai-copilot] the provider language model classes (`AnthropicModel`, `GoogleModel`, `OllamaModel`, `OpenAiModel`, `CopilotLanguageModel`) no longer expose public constructors; they are `@injectable` and receive their configuration through an injected `<provider>ModelParams` object (a symbol) plus injected service dependencies. Instantiate them via the corresponding `<provider>LanguageModelFactory` (or the DI container) instead of `new`, and drop constructor overrides in subclasses [#17623](https://github.com/eclipse-theia/theia/pull/17623)
Comment thread
sdirix marked this conversation as resolved.
Outdated

## 1.75.0 - 8/27/2026

- [ai] added `gemini-3.7-flash` to the default models [#17947](https://github.com/eclipse-theia/theia/pull/17947) - Contributed on behalf of STMicroelectronics
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