oh-my-opencode-kikokikok 2.15.7 → 2.15.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1 -1
- package/dist/features/letta-memory/adapter.d.ts +13 -3
- package/dist/index.js +98 -28
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -2253,7 +2253,7 @@ var require_picocolors = __commonJS((exports, module) => {
|
|
|
2253
2253
|
var require_package = __commonJS((exports, module) => {
|
|
2254
2254
|
module.exports = {
|
|
2255
2255
|
name: "oh-my-opencode-kikokikok",
|
|
2256
|
-
version: "2.15.
|
|
2256
|
+
version: "2.15.9",
|
|
2257
2257
|
description: "OpenCode plugin - custom agents (oracle, librarian) and enhanced features",
|
|
2258
2258
|
main: "dist/index.js",
|
|
2259
2259
|
types: "dist/index.d.ts",
|
|
@@ -3,10 +3,20 @@ export declare class LettaAdapter {
|
|
|
3
3
|
private config;
|
|
4
4
|
private endpoint;
|
|
5
5
|
private agentCache;
|
|
6
|
-
private
|
|
7
|
-
private
|
|
6
|
+
private modelCache;
|
|
7
|
+
private modelCachePromise;
|
|
8
|
+
private resolvedEmbeddingModel;
|
|
9
|
+
private resolvedLlmModel;
|
|
8
10
|
constructor(config: LettaConfig);
|
|
9
|
-
private
|
|
11
|
+
private getModels;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves user model name to Letta handle. Letta requires exact handle matches
|
|
14
|
+
* AND valid provider prefix (letta/, openai/). Models with other prefixes like
|
|
15
|
+
* openai-proxy/ will fail agent creation even if registered in the model list.
|
|
16
|
+
*/
|
|
17
|
+
private resolveModelHandle;
|
|
18
|
+
private getEmbeddingModel;
|
|
19
|
+
private getLlmModel;
|
|
10
20
|
add(input: AddMemoryInput): Promise<Memory>;
|
|
11
21
|
search(input: SearchMemoryInput): Promise<MemorySearchResult[]>;
|
|
12
22
|
get(id: string): Promise<Memory | null>;
|
package/dist/index.js
CHANGED
|
@@ -43783,29 +43783,28 @@ var DEFAULT_ENDPOINT2 = "http://localhost:8283";
|
|
|
43783
43783
|
var DEFAULT_AGENT_PREFIX = "opencode";
|
|
43784
43784
|
var DEFAULT_LLM_MODEL = "letta/letta-free";
|
|
43785
43785
|
var DEFAULT_EMBEDDING_MODEL = "letta/letta-free";
|
|
43786
|
+
var VALID_PROVIDERS = ["letta", "openai"];
|
|
43786
43787
|
|
|
43787
43788
|
class LettaAdapter {
|
|
43788
43789
|
config;
|
|
43789
43790
|
endpoint;
|
|
43790
43791
|
agentCache = new Map;
|
|
43791
|
-
|
|
43792
|
-
|
|
43792
|
+
modelCache = null;
|
|
43793
|
+
modelCachePromise = null;
|
|
43794
|
+
resolvedEmbeddingModel = null;
|
|
43795
|
+
resolvedLlmModel = null;
|
|
43793
43796
|
constructor(config3) {
|
|
43794
43797
|
this.config = config3;
|
|
43795
43798
|
this.endpoint = config3.endpoint ?? DEFAULT_ENDPOINT2;
|
|
43796
43799
|
}
|
|
43797
|
-
async
|
|
43798
|
-
if (this.
|
|
43799
|
-
return this.
|
|
43800
|
-
}
|
|
43801
|
-
if (this.detectedEmbeddingModel) {
|
|
43802
|
-
return this.detectedEmbeddingModel;
|
|
43800
|
+
async getModels() {
|
|
43801
|
+
if (this.modelCache) {
|
|
43802
|
+
return this.modelCache;
|
|
43803
43803
|
}
|
|
43804
|
-
if (this.
|
|
43805
|
-
|
|
43806
|
-
return this.detectedEmbeddingModel ?? DEFAULT_EMBEDDING_MODEL;
|
|
43804
|
+
if (this.modelCachePromise) {
|
|
43805
|
+
return this.modelCachePromise;
|
|
43807
43806
|
}
|
|
43808
|
-
this.
|
|
43807
|
+
this.modelCachePromise = (async () => {
|
|
43809
43808
|
try {
|
|
43810
43809
|
const response2 = await fetch(`${this.endpoint}/v1/models`, {
|
|
43811
43810
|
method: "GET",
|
|
@@ -43813,20 +43812,89 @@ class LettaAdapter {
|
|
|
43813
43812
|
signal: AbortSignal.timeout(1e4)
|
|
43814
43813
|
});
|
|
43815
43814
|
if (!response2.ok) {
|
|
43816
|
-
return;
|
|
43815
|
+
return [];
|
|
43817
43816
|
}
|
|
43818
43817
|
const models = await response2.json();
|
|
43819
|
-
|
|
43820
|
-
|
|
43821
|
-
|
|
43822
|
-
|
|
43823
|
-
|
|
43824
|
-
this.detectedEmbeddingModel = `openai/${model.name}`;
|
|
43825
|
-
}
|
|
43826
|
-
} catch {}
|
|
43818
|
+
this.modelCache = models;
|
|
43819
|
+
return models;
|
|
43820
|
+
} catch {
|
|
43821
|
+
return [];
|
|
43822
|
+
}
|
|
43827
43823
|
})();
|
|
43828
|
-
|
|
43829
|
-
|
|
43824
|
+
return this.modelCachePromise;
|
|
43825
|
+
}
|
|
43826
|
+
async resolveModelHandle(requestedModel, isEmbedding = false) {
|
|
43827
|
+
const models = await this.getModels();
|
|
43828
|
+
if (models.length === 0) {
|
|
43829
|
+
return requestedModel;
|
|
43830
|
+
}
|
|
43831
|
+
const hasValidProvider = (handle) => {
|
|
43832
|
+
const provider = handle.split("/")[0];
|
|
43833
|
+
return VALID_PROVIDERS.includes(provider);
|
|
43834
|
+
};
|
|
43835
|
+
const exactMatch = models.find((m) => m.handle === requestedModel && hasValidProvider(m.handle));
|
|
43836
|
+
if (exactMatch) {
|
|
43837
|
+
return exactMatch.handle;
|
|
43838
|
+
}
|
|
43839
|
+
const requestedName = requestedModel.includes("/") ? requestedModel.split("/").pop() : requestedModel;
|
|
43840
|
+
const candidates = models.filter((m) => {
|
|
43841
|
+
if (!hasValidProvider(m.handle)) {
|
|
43842
|
+
return false;
|
|
43843
|
+
}
|
|
43844
|
+
if (isEmbedding && !m.name.includes("embedding")) {
|
|
43845
|
+
return false;
|
|
43846
|
+
}
|
|
43847
|
+
return m.name.includes(requestedName) || m.handle.includes(requestedName);
|
|
43848
|
+
});
|
|
43849
|
+
if (candidates.length > 0) {
|
|
43850
|
+
const proxyModel = candidates.find((m) => m.model_endpoint?.includes("host.docker.internal"));
|
|
43851
|
+
return proxyModel?.handle ?? candidates[0].handle;
|
|
43852
|
+
}
|
|
43853
|
+
if (isEmbedding) {
|
|
43854
|
+
const validEmbeddingModels = models.filter((m) => m.name.includes("embedding") && hasValidProvider(m.handle));
|
|
43855
|
+
if (validEmbeddingModels.length > 0) {
|
|
43856
|
+
const preferredName = this.config.preferredEmbeddingModel ?? "text-embedding-3-small";
|
|
43857
|
+
const preferred = validEmbeddingModels.find((m) => m.name.includes(preferredName));
|
|
43858
|
+
return preferred?.handle ?? validEmbeddingModels[0].handle;
|
|
43859
|
+
}
|
|
43860
|
+
}
|
|
43861
|
+
return isEmbedding ? DEFAULT_EMBEDDING_MODEL : DEFAULT_LLM_MODEL;
|
|
43862
|
+
}
|
|
43863
|
+
async getEmbeddingModel() {
|
|
43864
|
+
if (this.resolvedEmbeddingModel) {
|
|
43865
|
+
return this.resolvedEmbeddingModel;
|
|
43866
|
+
}
|
|
43867
|
+
const configModel = this.config.embeddingModel;
|
|
43868
|
+
if (configModel) {
|
|
43869
|
+
this.resolvedEmbeddingModel = await this.resolveModelHandle(configModel, true);
|
|
43870
|
+
} else {
|
|
43871
|
+
const models = await this.getModels();
|
|
43872
|
+
const hasValidProvider = (handle) => {
|
|
43873
|
+
const provider = handle.split("/")[0];
|
|
43874
|
+
return VALID_PROVIDERS.includes(provider);
|
|
43875
|
+
};
|
|
43876
|
+
const validEmbeddingModels = models.filter((m) => m.name.includes("embedding") && hasValidProvider(m.handle));
|
|
43877
|
+
if (validEmbeddingModels.length > 0) {
|
|
43878
|
+
const preferredName = this.config.preferredEmbeddingModel ?? "text-embedding-3-small";
|
|
43879
|
+
const preferred = validEmbeddingModels.find((m) => m.name.includes(preferredName));
|
|
43880
|
+
this.resolvedEmbeddingModel = preferred?.handle ?? validEmbeddingModels[0].handle;
|
|
43881
|
+
} else {
|
|
43882
|
+
this.resolvedEmbeddingModel = DEFAULT_EMBEDDING_MODEL;
|
|
43883
|
+
}
|
|
43884
|
+
}
|
|
43885
|
+
return this.resolvedEmbeddingModel;
|
|
43886
|
+
}
|
|
43887
|
+
async getLlmModel() {
|
|
43888
|
+
if (this.resolvedLlmModel) {
|
|
43889
|
+
return this.resolvedLlmModel;
|
|
43890
|
+
}
|
|
43891
|
+
const configModel = this.config.llmModel;
|
|
43892
|
+
if (configModel) {
|
|
43893
|
+
this.resolvedLlmModel = await this.resolveModelHandle(configModel, false);
|
|
43894
|
+
} else {
|
|
43895
|
+
this.resolvedLlmModel = DEFAULT_LLM_MODEL;
|
|
43896
|
+
}
|
|
43897
|
+
return this.resolvedLlmModel;
|
|
43830
43898
|
}
|
|
43831
43899
|
async add(input) {
|
|
43832
43900
|
if (!this.config.enabled) {
|
|
@@ -44009,13 +44077,14 @@ class LettaAdapter {
|
|
|
44009
44077
|
}
|
|
44010
44078
|
return existing;
|
|
44011
44079
|
}
|
|
44012
|
-
const embeddingModel = await this.
|
|
44080
|
+
const embeddingModel = await this.getEmbeddingModel();
|
|
44081
|
+
const llmModel = await this.getLlmModel();
|
|
44013
44082
|
const agentName = this.getAgentName(layer);
|
|
44014
44083
|
const response2 = await this.request("/v1/agents", {
|
|
44015
44084
|
method: "POST",
|
|
44016
44085
|
body: JSON.stringify({
|
|
44017
44086
|
name: agentName,
|
|
44018
|
-
model:
|
|
44087
|
+
model: llmModel,
|
|
44019
44088
|
embedding: embeddingModel,
|
|
44020
44089
|
memory_blocks: [
|
|
44021
44090
|
{ label: "persona", value: `OpenCode memory agent for ${layer} layer` },
|
|
@@ -44040,7 +44109,7 @@ class LettaAdapter {
|
|
|
44040
44109
|
if (!embeddingHandle)
|
|
44041
44110
|
return false;
|
|
44042
44111
|
if (embeddingHandle === "letta/letta-free") {
|
|
44043
|
-
const detected = await this.
|
|
44112
|
+
const detected = await this.getEmbeddingModel();
|
|
44044
44113
|
return detected !== "letta/letta-free";
|
|
44045
44114
|
}
|
|
44046
44115
|
return false;
|
|
@@ -44048,13 +44117,14 @@ class LettaAdapter {
|
|
|
44048
44117
|
async recreateAgentWithCorrectEmbedding(existingAgent, layer) {
|
|
44049
44118
|
await this.request(`/v1/agents/${existingAgent.id}`, { method: "DELETE" }).catch(() => {});
|
|
44050
44119
|
this.agentCache.delete(layer);
|
|
44051
|
-
const embeddingModel = await this.
|
|
44120
|
+
const embeddingModel = await this.getEmbeddingModel();
|
|
44121
|
+
const llmModel = await this.getLlmModel();
|
|
44052
44122
|
const agentName = this.getAgentName(layer);
|
|
44053
44123
|
const response2 = await this.request("/v1/agents", {
|
|
44054
44124
|
method: "POST",
|
|
44055
44125
|
body: JSON.stringify({
|
|
44056
44126
|
name: agentName,
|
|
44057
|
-
model:
|
|
44127
|
+
model: llmModel,
|
|
44058
44128
|
embedding: embeddingModel,
|
|
44059
44129
|
memory_blocks: [
|
|
44060
44130
|
{ label: "persona", value: `OpenCode memory agent for ${layer} layer` },
|