feat: support for Oracle OCI Platform#2058
feat: support for Oracle OCI Platform#2058zshbleaker wants to merge 13 commits intoTEN-framework:mainfrom
Conversation
GPT-4o has been removed since Feb 16, 2026
For using more vendors like oracle
PR Review: feat/support-oracle-oci-platformThanks for this contribution adding Oracle OCI ASR and TTS extensions, along with OpenAI LLM2 improvements. The overall structure is solid, with good test coverage and thoughtful error handling. Below is my detailed review. Critical Issues1. Incomplete graph in
|
|
PR Review: feat: support for Oracle OCI PlatformThanks for adding Oracle OCI support! The extensions are well-structured with good test coverage. Below are findings ranging from blocking issues to minor suggestions. Critical / Functional1. Incomplete graph connections in voice_assistant_oracle The property.json graph is missing connections between the llm, message_collector, and the rest of the pipeline. The connections section only wires:
But there are NO connections from:
As-is, this graph will not function. Audio goes into ASR and stops there. Compare with the working voice_assistant graph for the missing edges. 2. Shared OCI_REGION env var with conflicting defaults In the voice_assistant_oracle graph, ASR uses us-ashburn-1 as fallback while TTS uses us-phoenix-1 as fallback. The README for oracle_tts explicitly notes TTS may only be available in us-phoenix-1. Sharing a single OCI_REGION variable means:
Consider separate env vars (OCI_ASR_REGION / OCI_TTS_REGION), or document clearly that OCI_REGION must be set to us-phoenix-1 when using TTS. Bugs / Correctness3. gpt-5.1-chat-latest model name inconsistency .env.example sets OPENAI_MODEL=gpt-5.1-chat-latest, but openai.py changes the code default to gpt-4o-mini. These are inconsistent. Please verify that gpt-5.1-chat-latest is a valid current OpenAI model identifier, or align both to the same value. 4. on_close() callback can fire during intentional close() In recognition.py, when close() cancels _message_task, the finally block of _message_handler fires callback.on_close(). In extension.py, on_close() then calls _handle_reconnect(). The guard (if not self.stopped) should prevent a spurious reconnect, but this relies on self.stopped being True before recognition.close() is called. If stop_connection() is ever called outside of a shutdown path, a reconnect loop could be triggered. Adding a suppress_callback flag to OracleASRRecognition.close() would make the intent explicit. 5. _strip_wav_header trailing chunk detection is fragile The heuristic checks if bytes at the next position are ASCII letters or spaces to detect trailing WAV chunks. PCM audio data can contain ASCII byte values, producing false positives. Consider explicitly matching known chunk IDs (LIST, fact, id3, INFO) instead of the character range check. Code Quality6. OracleTTS.reset() is unused The async reset() method in oracle_tts.py re-initializes the client but is never called from extension.py or anywhere else. Wire it up or remove it. 7. vendor() in TTS extension missing @OverRide oracle_tts_python/extension.py defines vendor() without the @OverRide decorator while the ASR extension uses it consistently. 8. default_headers blocked list is incomplete In openai.py _sanitize_default_headers, the blocked set is only api-key and proxy-authorization. The common variant x-api-key is not blocked. Also, authorization only triggers a warning (not a block), allowing callers to silently replace the built-in Bearer token. Consider whether this is intended. 9. Taskfile symlink step uses ln -snf silently ln -snf silently replaces any existing symlink or real directory at the destination. Add a guard or at minimum a comment explaining the intent, to avoid masking errors if ten_packages/system already exists. Minor / Nits10. .gitignore PEM scope too narrow 11. key_file path not validated at startup 12. Verify ORACLE_LLM_BASE_URL endpoint path Positives
The most important items to address before merge are #1 (incomplete graph connections) and #2 (OCI_REGION conflict), as they would prevent the oracle voice assistant from working out of the box. |
PR Review: feat: support for Oracle OCI PlatformThanks for this well-structured contribution! The Oracle ASR/TTS extensions follow the existing patterns cleanly and include solid test coverage. Below are my findings, from critical to minor. 🚨 Critical — Functional1. Incomplete graph connections in The oracle voice-assistant graph is missing several connections:
Without these connections the oracle assistant will hear the user (ASR works) but never call the LLM or produce speech. Compare with the existing 🐛 Bugs2.
# current (no enforcement)
class OracleASRRecognitionCallback:
@abstractmethod
async def on_open(self): ...
# fix
from abc import ABC, abstractmethod
class OracleASRRecognitionCallback(ABC):
@abstractmethod
async def on_open(self): ...Python only enforces abstract methods when the class inherits from 3. The change from // before: OS env vars win over .env (standard 12-factor behaviour)
err := godotenv.Load()
// after: .env file silently shadows real env vars (breaks containers)
err := godotenv.Overload()This is a subtle production footgun — Kubernetes/Docker deployments that inject secrets via env vars will have them silently overridden by a stale if err := godotenv.Load(); err != nil {
if err2 := godotenv.Load("../.env"); err2 != nil {
slog.Warn("load .env file failed", "err", err)
}
}
|
|
All 18 fixes are complete with no linter errors. Here's the summary: Critical / Bugs (1-4):
Design / Quality (5-13):
Minor (14-18):
|
Includding:
Feat:
Fix: